如何检查失败的“码头构建”的文件系统?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

我试图为我们的开发过程建立一个新的Docker形象,使用cpanm安装一组Perl模块作为各种项目的基本映像。

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

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

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

我发现

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

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

提问于
用户回答回答于

每次停靠器成功执行RUN命令从Dockerfile中提交图像文件系统中的一个新层。可以方便地使用这些层ID作为图像来启动一个新容器。

请使用以下Dockerfile:

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

并建造它:

$ docker build -t so-2622957 .
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

当然,可能希望启动一个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

如果确实需要在失败的实际层中进行实验,而不是从最后一个工作层开始工作.

用户回答回答于

上面的答案适用于想要在失败的命令之前检查状态的情况。

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

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

$ 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]

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

扫码关注云+社区