失敗した `docker build` のファイルシステムを検査するにはどうすればよいですか? 質問する

失敗した `docker build` のファイルシステムを検査するにはどうすればよいですか? 質問する

開発プロセス用に新しい Docker イメージを構築し、cpanmさまざまなプロジェクトのベース イメージとして一連の Perl モジュールをインストールしようとしています。

Dockerfile の開発中に、cpanm一部のモジュールが正常にインストールされなかったため、失敗コードが返されます。

apt他にもいくつかインストールする必要があるのは確かです。

/.cpanm/workログを検査するために、出力に引用されているディレクトリはどこにありますか? 一般的なケースでは、失敗したdocker buildコマンドのファイル システムをどのように検査できますか?

実行した後、find私は発見しました

/var/lib/docker/aufs/diff/3afa404e[...]/.cpanm

これは信頼できるのでしょうか、それとも「ベア」コンテナを構築し、必要なものがすべて揃うまで手動で実行したほうがよいでしょうか?

ベストアンサー1

dockerがRUNDockerfileからコマンドを正常に実行するたびに、画像ファイルシステムの新しいレイヤーコミットされます。便利なことに、これらのレイヤー ID をイメージとして使用して、新しいコンテナーを開始できます。

次の Dockerfile を見てください。

FROM busybox
RUN echo 'foo' > /tmp/foo.txt
RUN echo 'bar' >> /tmp/foo.txt

ビルドします: (DOCKER_BUILDKIT=0 に設定すると、イメージ レイヤー ID が表示されます)

$ DOCKER_BUILDKIT=0 docker build -t so-26220957 .
Sending build context to Docker daemon 47.62 kB
Step 1/3 : FROM busybox
 ---> 00f017a8c2a6
Step 2/3 : RUN echo 'foo' > /tmp/foo.txt
 ---> Running in 4dbd01ebf27f
 ---> 044e1532c690
Removing intermediate container 4dbd01ebf27f
Step 3/3 : RUN echo 'bar' >> /tmp/foo.txt
 ---> Running in 74d81cb9d2b1
 ---> 5bd8172529c1
Removing intermediate container 74d81cb9d2b1
Successfully built 5bd8172529c1

から新しいコンテナを起動できるようになりました00f017a8c2a6044e1532c6905bd8172529c1

$ docker run --rm 00f017a8c2a6 cat /tmp/foo.txt
cat: /tmp/foo.txt: No such file or directory

$ docker run --rm 044e1532c690 cat /tmp/foo.txt
foo

$ docker run --rm 5bd8172529c1 cat /tmp/foo.txt
foo
bar

もちろん、シェルを起動してファイルシステムを探索し、コマンドを試すこともできます。

$ docker run --rm -it 044e1532c690 sh      
/ # ls -l /tmp
total 4
-rw-r--r--    1 root     root             4 Mar  9 19:09 foo.txt
/ # cat /tmp/foo.txt 
foo

Dockerfile コマンドの 1 つが失敗した場合、必要なのは、前のレイヤーの IDを探し、その ID から作成されたコンテナーでシェルを実行することです。

docker run --rm -it <id_last_working_layer> bash -il

コンテナに入ったら:

  • 失敗したコマンドを試して問題を再現します
  • コマンドを修正してテストします
  • 最後に修正したコマンドでDockerfileを更新します

最後に作業したレイヤーから作業するのではなく、実際に失敗したレイヤーで実験する必要がある場合は、ドリューの答え


更新
Dockerバージョン20.10では中間コンテナハッシュはサポートされていません。Jannis Schönleber 氏の回答。

おすすめ記事