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件のコメント