gpt4 book ai didi

debugging - 如何检查失败的 `docker build` 的文件系统?

转载 作者:IT老高 更新时间:2023-10-28 12:32:42 27 4
gpt4 key购买 nike

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

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

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

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

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

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

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

最佳答案

每次 docker 从 Dockerfile 成功执行 RUN 命令时,a new layer in the image filesystem promise 。您可以方便地使用这些图层 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's answer .

关于debugging - 如何检查失败的 `docker build` 的文件系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26220957/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com