如何检查失败的“docker build”的文件系统?

新手上路,请多包涵

我正在尝试为我们的开发过程构建一个新的 Docker 映像,使用 cpanm 安装一堆 Perl 模块作为各种项目的基础映像。

在开发 Dockerfile 时, cpanm 返回失败代码,因为某些模块没有安装干净。

我很确定我需要 apt 来安装更多东西。

我的问题是,为了检查日志,我在哪里可以找到输出中引用的 /.cpanm/work 目录?在一般情况下,如何检查失败的 docker build 命令的文件系统?

早上编辑 在咬紧牙关运行 find 我发现

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

这是可靠的,还是我最好构建一个“裸”容器并手动运行东西,直到我拥有我需要的所有东西?

原文由 Altreus 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 433
2 个回答

每次 docker 从 Dockerfile 成功执行 RUN 命令时,都会提交 映像文件系统中的新层。您可以方便地使用这些图层 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

您现在可以从 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

当然,您可能想启动一个 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 的回答

原文由 Thomasleveil 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您想检查失败命令之前的状态,最佳答案是有效的。

但是,问题询问如何检查失败容器本身的状态。在我的情况下,失败的命令是一个需要几个小时的构建,因此在失败的命令之前倒带并再次运行它需要很长时间并且不是很有帮助。

这里的解决方案是找到失败的容器:

 $ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                          PORTS               NAMES
6934ada98de6        42e0228751b3        "/bin/sh -c './utils/"   24 minutes ago      Exited (1) About a minute ago                       sleepy_bell

将其提交到图像:

 $ docker commit 6934ada98de6
sha256:7015687976a478e0e94b60fa496d319cdf4ec847bcd612aecf869a72336e6b83

然后运行映像 [如果需要,运行 bash]:

 $ docker run -it 7015687976a4 [bash -il]

现在,您实际上是在查看构建失败时的状态,而不是在运行导致失败的命令之前的状态。

原文由 Drew 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Stack Overflow 翻译
子站问答
访问
宣传栏