每次 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
启动一个新容器: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
当然,您可能想启动一个 shell 来探索文件系统并尝试命令:
$ 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并在从该 id 创建的容器中运行 shell:
docker run --rm -it <id_last_working_layer> bash -il
一旦进入容器:
- 尝试失败的命令,并重现问题
- 然后修复命令并测试它
- 最后用固定的命令更新你的 Dockerfile
如果您确实需要在失败的实际层中进行试验,而不是从最后一个工作层开始工作,请参阅Drew 的回答。