RUN
docker が 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
、044e1532c690
およびから新しいコンテナを開始できるようになりました5bd8172529c1
。
$ 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 を更新します
最後の作業レイヤーから作業するのではなく、失敗した実際のレイヤーで実際に実験する必要がある場合は、Drew の回答を参照してください。