如何从Docker构建中获取镜像?

8
有没有办法将 "docker build" 命令中的构建产物传输到主机上? 例如,有以下 "Dockerfile" 文件,是否有方法可以获取文件 "log.log"?
FROM alpine:3.7 as base
RUN mkdir /log/
RUN touch /log/log.log

我尝试使用 COPY 命令时似乎只能将文件从主机复制到 Docker 镜像中:

FROM alpine:3.7 as base
RUN mkdir /log/
RUN touch /log/log.log
COPY ./foo.bar /log/
RUN ls -l /log/
COPY /log/log.log ./
$ touch ./foo.bar && docker build -t demo --no-cache .
Sending build context to Docker daemon  15.36kB
Step 1/6 : FROM alpine:3.7 as base
 ---> 6d1ef012b567
Step 2/6 : RUN mkdir /log/
 ---> Running in 4b6df3797ee3
Removing intermediate container 4b6df3797ee3
 ---> 827e6001d34a
Step 3/6 : RUN touch /log/log.log
 ---> Running in d93d50d61b69
Removing intermediate container d93d50d61b69
 ---> c44620d4f9c4
Step 4/6 : COPY ./foo.bar /log/
 ---> 6996718d44da
Step 5/6 : RUN ls -l /log/
 ---> Running in 84e997af182b
total 0
-rw-r--r--    1 root     root             0 Nov  8 21:44 foo.bar
-rw-r--r--    1 root     root             0 Nov  8 21:44 log.log
Removing intermediate container 84e997af182b
 ---> 5a440f258772
Step 6/6 : COPY /log/log.log ./
COPY failed: stat /var/lib/docker/tmp/docker-builder677155266/log/log.log: no such file or directory
我知道使用docker run时可以使用-v(卷挂载)参数,但这不是我想要的:我想了解是否有一种方法可以从docker build过程中获取构建产物。

更新:关于@ChristianFosli建议使用docker cp:该解决方案需要一个docker容器。然而,在我的情况下,我之所以要在docker build过程中提取文件,是因为我的Dockerfile运行失败,因此我没有可运行的镜像可以作为容器进行docker cp操作。也就是说,我想要从docker build过程中提取的文件是包含有关故障调试信息的元数据文件,我想要检查它。


1
最新版本的Docker似乎有一种方法可以转储构建的镜像;链接的问题中有语法。对于您的“更新”用例可能会有所帮助,因为docker build在构建过程中打印出来的12位十六进制ID是有效的Docker镜像ID,所以您可以运行docker run --rm -it 5a440f258772 sh在部分构建的镜像上获取交互式调试shell。 - David Maze
@DavidMaze - 确认您所解释的内容:我确实可以对这些“中间”Docker镜像执行docker run --rm -it,并以此方式获取我的文件。谢谢! - StoneThrow
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
2
您可以使用docker cp将文件从容器复制到本地文件系统。 请查看文档以获取详细信息。 我不知道有没有一种方法可以直接从Docker镜像中复制文件,但是您可以基于您的镜像创建一个容器(而不运行它),然后使用docker cp从其中复制文件。创建容器的命令为docker create

1
很不幸,我的具体问题是我的Dockerfile运行的可执行文件失败了(返回状态为非零),因此没有生成docker镜像,因此我没有镜像可以作为容器运行。因此,我试图从docker build过程本身获取调试信息。抱歉:我的意图是简化我的问题范围,但我想这是相关的信息。我会更新问题。 - StoneThrow
啊,这很有道理,不用担心 :-) - Christian Fosli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,