当前位置: 首页 > 面试题库 >

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

长孙硕
2023-03-14
问题内容

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

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

我相当确定我需要apt安装更多东西。

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

早上编辑 咬住子弹并运行后,find我发现

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

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


问题答案:

每当RUNdocker 成功从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

您现在可以开始从一个新的容器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的答案。



 类似资料:
  • 我试图为我们的开发过程构建一个新的Docker映像,使用安装一堆Perl模块,作为各种项目的基础映像。 在开发Dockerfile时,返回一个失败代码,因为某些模块安装不干净。 我很确定我需要获得来安装更多的东西。

  • 问题内容: 最近,我接受了用JSF编写的Web系统的支持和编程。代码有点凌乱和多余,是的,​​不存在任何文档。 该系统具有40多个jar库,由于旧版本和测试,其中大多数是冗余的。要删除一个jar,我必须检查它是否未在代码中导入,因此我在代码中搜索了jar导入路径(我正在使用IntelliJ IDE),确保未使用它,然后将其删除。 但是,在编译代码后,在测试过程中发生了许多运行时错误。我发现我删除了

  • 我得到以下错误: 当我尝试在muzei应用程序中使用我的

  • 在首次尝试实现AES-GCM的过程中,面临着身份验证标记生成、加密密码生成和GCM mac校验失败的问题。对于当前实现,正在填充,但仍然为空。因此,给出了“”。这似乎是围绕字节数组大小的一些问题,能否有人分享一下,应该在什么基础上确定输出缓冲区大小?这是不是应该分块进行? 任何指向AES-GCM实施的指针/链接都将受到高度赞赏。 以下是我们的实施情况: 它给出以下例外情况: 提前谢谢!!

  • 我看到了“krbeexception:Checksum failed”异常。看起来像是kerberos问题,但我无法解决。 任何关于如何解决问题的建议都会很好!提前谢谢。 机器细节: 没有可用的LSB模块。发行商ID:Ubuntu说明:Ubuntu 12.04.4 LTS发行版:12.04 java版本“1.7.0_55”OpenJDK运行时环境(IcedTea 2.4.7)(7u55-2.4.7

  • 问题内容: 我正在某个程序上工作,根据文件的扩展名,我需要做不同的事情。我可以用这个吗? 问题答案: 假设是一个字符串,可以使用: 要不区分大小写,并消除可能很大的else-if链: