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作为变量_ nodeJS dockerode Docker