1. ホーム
  2. デバッギング

[解決済み] [Solved] 失敗した `docker build` のファイルシステムを検査するにはどうしたらいいですか?

2022-03-25 17:21:36

質問

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

Dockerfileを開発しながら。 cpanm は、一部のモジュールがきれいにインストールされなかったため、失敗コードを返します。

私は、このような場合、間違いなく apt をインストールする必要があります。

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

モーニング編集 を実行した結果 find を発見しました。

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

それとも、必要なものがすべて揃うまで、"bare" コンテナを構築して手動で実行したほうがいいのでしょうか?

解決方法は?

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

以下のDockerfileを例にとります。

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

を作成し、それをビルドします。

$ 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

から新しいコンテナを起動できるようになりました。 00f017a8c2a6 , 044e1532c6905bd8172529c1 :

$ 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 コマンドのいずれかが失敗した場合、必要なのは 直前のレイヤーのID で作成したコンテナでシェルを実行します。

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

コンテナに一度

  • 失敗したコマンドを試し、問題を再現してください。
  • その後、コマンドを修正し、テストします。
  • 最後に、修正したコマンドでDockerfileを更新します。

どうしても、最後に動作したレイヤーからではなく、実際に失敗したレイヤーで実験する必要がある場合は ドリューの回答 .