Docker 将文件从 dockerfile 复制到主机

Posted

技术标签:

【中文标题】Docker 将文件从 dockerfile 复制到主机【英文标题】:Docker copy file to host from within dockerfile [duplicate] 【发布时间】:2018-09-13 06:42:01 【问题描述】:

我正在写一个Dockerfile 来构建一个应用程序。我知道您可以使用

手动将文件复制出容器
docker cp <containerId>:/file/path/within/container /host/path/target

(请参阅Copying files from Docker container to host),但我只想运行

docker build

并让它将我的Dockerfile 创建的构建工件转储到我的主机文件系统的某个位置。

我可以在 Dockerfile 中使用命令从容器中复制到主机中吗?喜欢COPY的反面吗?

【问题讨论】:

出于好奇,这里的用例是什么?即,如果您正在创建 Docker 映像(而不是运行容器),为什么您需要/希望从其中输出内容? 我不明白“图像”和“容器”之间的区别。我正在尝试构建具有大型复杂构建过程的 PDFium,这样我可以只给同事一个脚本,他们也可以构建它。然后我们想从构建过程中获得一个我们可以使用的输出库文件。 容器是图像的运行时实例化。一般来说,您通过docker build 从Dockerfile 构建一个镜像,然后通过docker run 从该镜像创建实例(容器)。我不知道您的情况的详细信息,但我很想将其建模为一个 3 步过程:(1)构建一个专用的 Docker 映像以执行隔离构建,(2)从此映像实例化一个容器, (3) 在此容器内运行 PDFium 构建(然后通过一种或另一种机制提取构建工件)。 明白了。我希望将环境设置封装并构建到一个脚本中。我想我会超出预期的 docker 使用范围。 如果你 docker 镜像,然后对主机哑巴怎么办?我厌倦了你提到的 docker dind 问题,但它只有在容器启动时才有效 【参考方案1】:

根据 Docker 文档,添加了 API 版本 1.40

Custom build outputs

满足您的需求:

默认情况下,本地容器镜像是根据构建结果创建的。 --output(或 -o)标志允许您覆盖此行为,并且 指定自定义导出器。例如,自定义导出器允许您 将构建工件导出为本地文件系统上的文件,而不是 一个 Docker 映像,可用于生成本地二进制文件, 代码生成等

例如

$ docker build --output type=tar,dest=out.tar .

多阶段Dockerfile

FROM golang AS build-stage
RUN go get -u github.com/LK4D4/vndr

FROM scratch AS export-stage
COPY --from=build-stage /go/bin/vndr /

--output 选项从目标阶段导出所有文件。普通的 仅导出特定文件的模式是进行多阶段构建 并使用 COPY --from 将所需文件复制到新的暂存阶段。

【讨论】:

这是迄今为止最好的答案!这个例子简洁明了!我对这个结构有点困惑:FROM scratch As export-stage。然后谷歌搜索后,我意识到scratch是一个docker保留关键字,表示“Docker的保留,最小图像” 非常重要的是要注意这仅适用于DOCKER_BUILDKIT=1,否则不会输出任何内容,也不会出现错误【参考方案2】:

除了@Marakai 出色的答案外,还必须设置环境变量 DOCKER_BUILDKIT=1。所以命令是:

$ DOCKER_BUILDKIT=1  docker build --output type=tar,dest=out.tar .

或者可以分成两个命令:

$ export DOCKER_BUILDKIT=1
$ docker build --output type=tar,dest=out.tar .  # to gen into a tar file

或者保存文件而不形成 tar 文件:

$ mkdir out
$ docker build  --output out .

文件将被复制到目录中。

【讨论】:

【参考方案3】:

也许这个命令就是你要搜索的东西

docker run -v ~/data:/var/logs <image>

-v ~/data:/var/logs 创建一个绑定挂载卷,将容器中的/var/logs 目录链接到主机上的~/data vdirectory。 Docker 使用 : 将主机路径与容器路径分开。

推荐How To Share Data between Docker Containers上的文章

【讨论】:

这不适合多阶段 docker 构建,因为只有最后一部分保存为图像,所以当您执行 docker run 时,中间阶段的任何内容都将不可用。但是,如果不需要中间阶段的文件,那么他可以通过这种方式从构建的图像中复制文件。 @jamesfaix 询问的是 docker build 而不是 docker run。要使用docker run,您首先需要有一个使用docker build 构建的镜像 @MatthiasSommer:为了更明确,-v 标志可用于 docker run 但不可用于 docker build。

以上是关于Docker 将文件从 dockerfile 复制到主机的主要内容,如果未能解决你的问题,请参考以下文章

如何将文件从 dockerfile 复制到主机?

将文件夹从 Dockerfile 复制到主机 [重复]

将文件路径传递给dockerfile作为变量_ nodeJS dockerode Docker

无法将中间docker容器文件复制到主机

Docker学习总结(58)——Dockerfile中,ADD和COPY的区别?

Docker学习总结(58)——Dockerfile中,ADD和COPY的区别?