Docker 如果生成失败,如何将文件从生成容器复制(日志)到主机?

Docker 如果生成失败,如何将文件从生成容器复制(日志)到主机?,docker,dockerfile,filesystems,Docker,Dockerfile,Filesystems,从Dockerfile下的命令运行docker build时,如何将一些日志文件从容器复制到主机?一旦构建失败,构建容器就会消失 一种方法是在每个RUN命令吞下非零退出代码后,将日志输出到STDOUT,然后重新推送原始退出代码。但它似乎并没有扩展,比如如果我们想复制整个目录,我们就不会压缩并输出到控制台:P 有没有可能的解决办法?可能是将文件从主机连接到容器,或者在生成过程中装载目录?如果您希望容器数据在容器退出后保持不变(例如日志、数据库或其他内容),则应将本地驱动器/文件夹装载到容器中,并将

Dockerfile
下的命令运行
docker build
时,如何将一些日志文件从容器复制到主机?一旦构建失败,构建容器就会消失

一种方法是在每个RUN命令吞下非零退出代码后,将日志输出到STDOUT,然后重新推送原始退出代码。但它似乎并没有扩展,比如如果我们想复制整个目录,我们就不会压缩并输出到控制台:P


有没有可能的解决办法?可能是将文件从主机连接到容器,或者在生成过程中装载目录?

如果您希望容器数据在容器退出后保持不变(例如日志、数据库或其他内容),则应将本地驱动器/文件夹装载到容器中,并将需要的任何内容写入装载位置。 在您的情况下,将本地文件夹(主机上)装载到容器中,并将生成日志写入该文件夹


有关更多选项,请参见此问题的答案

如果将日志推送到标准输出,则可以使用以下命令获取日志:

LOG_PATH=$(docker inspect --format='{{.LogPath}}' <the-name-of-your-docker>)
echo ================= Docker log start ===========================
sudo cat $LOG_PATH
echo ================= Docker log end =============================
LOG_PATH=$(docker-inspect--format='{{.LogPath}}})
回声=============================码头工人日志启动===========================
sudo cat$LOG\u路径
回声=============================码头工人日志结束=============================

您可能会发现使用chroot和@ti7更容易。您能否详细介绍一下chroot,它是否可以连接docker fs和主机fs?scratch图像的目的是什么?您可以在将内容添加到容器之前进行工作,从而获得一个更精简的图像。如果问题如此严重,在chroot中构建将允许您在任何阶段直接检索失败构建的日志,然后再从中创建容器。是否有自动化提示,如在CI中构建失败后自动执行此操作?另外,我实际上已经知道,我可以在每次运行后生成的中间映像中执行
docker cp
,但只有在运行步骤中生成成功时,该映像才会存在,否则生成容器的状态就会消失。我不确定你的评论是什么意思?如果构建失败,那么构建日志通常包含足够的信息来调试问题。构建工具通常会捕获输出到stdout的所有内容,因此确保所有构建步骤/任务/命令都在那里写入输出(如果需要/希望持久化该信息,还可以写入文件)因此,您可以仅使用捕获的生成作业的输出来诊断问题。在我的示例中,日志文件是在容器内的生成目录中生成的,它很大,并且不会打印到标准输出。正如我在问题的第二段中所说的,如果日志很大,您可能只需要将最后的X行写入stdout,例如使用tail命令?您还可以在生成失败时将日志复制到已装入的卷。您不能在映像生成期间装入卷。实际上,这仍然不考虑自动导出。日志将与命令的其他输出一起输出,也不容易导出目录,例如第2段中的问题。我想可以使用bash脚本将日志提取到文件中,并通过一些前缀和后缀将其余的命令输出提取到控制台中,但我真的希望我们可以按原样从构建容器克隆到主机