Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker从dockerfile中将文件复制到主机_Docker - Fatal编程技术网

Docker从dockerfile中将文件复制到主机

Docker从dockerfile中将文件复制到主机,docker,Docker,我正在编写一个Dockerfile来构建一个应用程序。我知道您可以使用手动将文件从容器中复制出来 docker cp <containerId>:/file/path/within/container /host/path/target 并将我的Dockerfile创建的构建工件转储到主机文件系统的某个地方 Dockerfile中是否有一个命令可用于从容器复制到主机中?与“复制”相反?可能您正在搜索此命令 docker run -v ~/data:/var/logs <ima

我正在编写一个
Dockerfile
来构建一个应用程序。我知道您可以使用手动将文件从容器中复制出来

docker cp <containerId>:/file/path/within/container /host/path/target
并将我的
Dockerfile
创建的构建工件转储到主机文件系统的某个地方


Dockerfile中是否有一个命令可用于从容器复制到主机中?与“复制”相反?

可能您正在搜索此命令

docker run -v ~/data:/var/logs <image>
docker run-v~/data:/var/logs
-v~/data:/var/logs
创建一个绑定装载卷,将容器中的
/var/logs
目录链接到主机上的
~/data
d目录。Docker使用:从容器路径拆分主机路径


根据Docker docs,添加API 1.40版,我建议在

上发表文章

这是为了满足您的需求:

默认情况下,将根据生成结果创建本地容器映像。 --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将所需文件复制到新的暂存阶段


除了@Marakai极好的答案之外,还必须将环境变量DOCKER\u 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 .

文件将被复制到目录中。

出于好奇,这里的用例是什么?i、 e.如果你正在创建一个Docker映像(与运行容器相反),为什么你需要/想要从中产生一些东西?我不理解“映像”和“容器”之间的区别。我正在尝试构建PDFium,它有一个复杂的构建过程,这样我就可以给同事一个脚本,他们也可以构建它。然后,我们希望从构建过程中获得一个可以使用的输出库文件。容器是映像的运行时实例化。一般来说,您可以通过
docker build
从Dockerfile构建一个映像,然后通过
docker run
从该映像创建实例(容器)。我不知道您的具体情况,但我会尝试将其建模为一个三步过程:(1)构建一个专用的Docker映像以执行独立构建,(2)从该映像实例化一个容器,(3)在此容器内运行PDFium构建(然后通过一种或另一种机制提取构建工件)。明白了。我希望封装环境设置并构建到一个脚本中。我想我有点超出了docker的预期用途。如果你在docker图像上做了一个傻子,然后对主机做了什么?我厌倦了你提到docker dind的问题,但它只在容器升级时起作用。这不适用于多阶段docker构建,因为只有最后一部分保存为图像,所以当你运行docker时,中间阶段的任何内容都将不可用。但是,如果不需要中间阶段的文件,则可以通过这种方式从构建映像复制文件。@jamesfaix询问的是
docker build
,而不是
docker run
。要利用
docker run
,您首先需要使用
docker build
@MatthiasSommer构建一个映像:为了更明确,docker run可使用-v标志,但docker build不可用。这是目前为止最好的答案!这个例子简明扼要!我对这个结构有点困惑:从零开始作为出口阶段。谷歌搜索之后,我意识到scratch是docker保留的关键字,表示“docker保留的最小图像”
$ mkdir out
$ docker build  --output out .