Docker で ubuntu のコンテナを作ろうとしたのですが、いろいろなエラーが表示されてうまくいかず、手間取ってしまったのでそのメモです。結論から言うと、DNSサーバがうまく動いておらずDNSルックアップがタイムアウトしていたのが原因でした。

Angular の開発環境を作るということで、Ubuntu のコンテナを作るための Dockerfile を作成して docker build を行ったのですが、エラーが発生してしまいました。

docker build ./ -t angular

最初のエラーは

failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to do request: Head https://registry-1.docker.io/v2/library/ubuntu/manifests/20.04: dial tcp: lookup registry-1.docker.io on 192.168.65.1:53: read udp 192.168.65.3:55402->192.168.65.1:53: i/o timeout

エラーメッセージの中には DNS とは書かれていないのですが、ポート53に対する通信が timeout しているようなので、DNS絡みのエラーであることがわかります。とりあえず再実行します。違うファイルで止まったり、また進んだりを繰り返していました。そうすると、次のようなエラーが表示されました。

The following packages have unmet dependencies:

パッケージの依存関係が満たされていないというエラーです。次のようなエラーも表示されました。

E: Unable to correct problems, you have held broken packages.

ダウンロードしたパッケージが壊れているようです。次のようなエラーも表示されました。

curl : Depends: libcurl4 (= 7.68.0-1ubuntu2.4) but it is not going to be installed

これは Curl をインストールしようとしているときに表示されたものですが、どうも Curl が必要とするファイルがうまく登録できていないようです。

ここまでの流れで起きていることは、エラーが発生したことでダウンロードしたパッケージが中途半端な状態になり、そのためにさらに新しいエラーを誘発しているという状況のようです。

解決策として、Dockerfile の上の方に下記の3行を追加します。

RUN apt-get autoclean
RUN apt-get clean all
RUN apt-get update

これによりすでに読み込まれているキャッシュ等が消されるので、中途半端なファイルによるエラーは表示されなくなります。

エラーの原因が解消するわけではないですが、エラーによって残ってしまったゴミデータを削除してから始めるということになりますので、エラーが発生する要因を少しでも減らすことにつながります。

再度 docker build を行ってみたところ、かなり進むようになったのですが、終盤にはいった頃にDNSのエラーが表示されてしまいました。DNSをなんとかしないといけないですね。

カテゴリー: サーバ関連

0件のコメント

コメントを残す

Avatar placeholder

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください