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

All*_*en 10 linux docker dockerfile

我想在dockerfile成功构建时获取一些文件,但它不会将文件从容器复制到主机.

这意味着当我构建dockerfile时,文件已经是主机.

Ben*_*n T 35

由于 Docker 19.03.0 在 2019 年 7 月引入了“自定义构建输出”,因此现在可以实现。请参阅有关自定义构建输出的官方文档。

为了能够在构建过程中将构建映像中的结果输出到主机中,您需要激活BuildKit,这是引擎执行构建阶段的一种更新推荐的向后兼容方式。请参阅官方文档以启用 BuildKit

这可以通过两种方式完成:

  1. 设置环境变量 DOCKER_BUILDKIT=1
  2. 默认情况下,通过将其添加"features": { "buildkit": true }到配置 json 的根目录中,将其设置在 docker 引擎中。

来自关于自定义构建输出的官方文档:

自定义导出器允许您将构建工件导出为本地文件系统上的文件,而不是 Docker 映像,这对于生成本地二进制文件、代码生成等非常有用。

...

本地导出器将生成的构建文件写入客户端的目录中。tar 导出器类似,但将文件写入单个 tarball (.tar)。

如果未指定类型,则该值默认为本地导出器的输出目录。

...

仅导出特定文件的常见模式是进行多阶段构建,并使用 COPY --from 将所需文件复制到新的临时阶段。

例如一个示例 Dockerfile

FROM alpine:latest AS stage1
WORKDIR /app
RUN echo "hello world" > output.txt

FROM scratch AS export-stage
COPY --from=stage1 /app/output.txt .
Run Code Online (Sandbox Code Playgroud)

跑步

DOCKER_BUILDKIT=1 docker build --file Dockerfile --output out .
Run Code Online (Sandbox Code Playgroud)

输出的尾部是:

 => [export-stage 1/1] COPY --from=stage1 /app/output.txt .
0.0s
 => exporting to client
0.1s
 => => copying files 45B
0.1s
Run Code Online (Sandbox Code Playgroud)

这将out/output.txt生成由该RUN命令创建的本地文件。

$ cat out/output.txt
hello world
Run Code Online (Sandbox Code Playgroud)

  • 2020年这应该是选择的答案!这就是“是”的方式。本 T => 谢谢! (3认同)

Von*_*onC 7

构建时,您有机会将文件从主机复制到您正在构建的映像(使用COPY指令ADD)

您也可以从一个复制文件容器(已被图像docker run"d)与主机泊坞窗CP(atually,CP可从主机到容器副本以及)

但是你无法复制"来自Dockerfile":Dockerfile只是一个指定如何构建图像的配方.

如果你想回到你的主机可能会在生成过程中已经产生了一些文件(例如像调用的脚本生成SSL),你可以运行一个容器,一个文件夹从您的主机安装和执行CP的命令.

例如,请参阅此getcrt脚本.

docker run -u root --entrypoint=/bin/sh --rm -i -v ${HOME}/b2d/apache:/apache apache << COMMANDS
pwd
cp crt /apache
cp key /apache
echo Changing owner from \$(id -u):\$(id -g) to $(id -u):$(id -u)
chown -R $(id -u):$(id -u) /apache/crt
chown -R $(id -u):$(id -u) /apache/key
COMMANDS
Run Code Online (Sandbox Code Playgroud)

一切之间COMMANDS是在容器上执行的命令,包括cp那些被复制在主机${HOME}/b2d/apache的文件夹,安装在容器如内/apache-v ${HOME}/b2d/apache:/apache.

这意味着每次你/apache在容器中复制任何东西时,你实际上是在${HOME}/b2d/apache主机上复制!


Chr*_*ski 5

尽管该Dockerfile功能不直接支持它,但您可以从构建的 docker 映像复制文件。

containerId=$(docker create example:latest)
docker cp "$containerId":/source/path /destination/path
docker rm "$containerId"
Run Code Online (Sandbox Code Playgroud)