我想在dockerfile构建成功时获取一些文件,但它不能将文件从容器复制到主机。这意味着当我构建dockerfile时,文件已经是宿主了。
z9gpfhce1#
自2019年7月Docker 19.03.0引入“自定义构建输出”以来,这已经成为可能。有关自定义构建输出,请参阅官方文档。若要在生成过程中启用从生成映像到主机的自定义生成输出,您需要激活BuildKit,这是一种较新的推荐向后兼容方式,可供引擎执行生成阶段。有关启用BuildKit的信息,请参见官方文档。这可以通过两种方式实现:1.设置环境变量DOCKER_BUILDKIT=1,或1.默认情况下,通过将"features": { "buildkit": true }添加到config json的根,在Docker引擎中设置它。来自关于自定义构建输出的官方文档:自定义导出器允许您将构建工件导出为本地文件系统上的文件,而不是Docker映像,这对于生成本地二进制文件、代码生成等非常有用。...本地导出器将生成的构建文件写入客户端的一个目录中,tar导出器与之类似,但将文件作为一个单独的tarball(.tar)写入。如果未指定类型,则该值默认为本地导出器的输出目录。...--output选项从目标阶段导出所有文件。仅导出特定文件的常见模式是执行多阶段构建,然后使用COPY --from将所需文件复制到新的临时阶段。例如,示例停靠文件
DOCKER_BUILDKIT=1
"features": { "buildkit": true }
FROM alpine:latest AS stage1 WORKDIR /app RUN echo "hello world" > output.txt FROM scratch AS export-stage COPY --from=stage1 /app/output.txt .
跑步
DOCKER_BUILDKIT=1 docker build --file Dockerfile --output out .
输出的尾部为:
=> [export-stage 1/1] COPY --from=stage1 /app/output.txt . 0.0s => exporting to client 0.1s => => copying files 45B 0.1s
这将生成由RUN命令创建的本地文件out/output.txt。
RUN
out/output.txt
$ cat out/output.txt hello world
--output选项将从目标阶段导出所有文件。因此,将非临时阶段与COPY --from一起使用将导致无关文件复制到输出。建议将临时阶段与COPY --from一起使用。
--output
COPY --from
ugmeyewa2#
不支持将文件““从Dockerfile”“复制到主机。Dockerfile只是指定如何生成映像的方法。
构建时,您有机会将文件从主机复制到正在构建的映像(使用COPY指令或ADD)您还可以使用docker cp将文件从 container(已docker run的映像)复制到主机(实际上,cp也可以从主机复制到容器)如果你想把一些可能在构建过程中生成的文件返回到你的主机(比如调用一个生成ssl的脚本),你可以运行一个容器,从你的主机挂载一个文件夹,然后执行cp命令。例如,请参见getcrt script。
COPY
ADD
docker run
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
COMMANDS之间的所有内容都是在容器上执行的命令,包括复制到主机${HOME}/b2d/apache文件夹上的cp命令,在容器中作为/apache和-v ${HOME}/b2d/apache:/apache装载。这意味着每次您在容器中复制/apache上的任何内容时,您实际上是在主机上的${HOME}/b2d/apache中复制!
COMMANDS
${HOME}/b2d/apache
cp
/apache
-v ${HOME}/b2d/apache:/apache
uttx8gqw3#
尽管Dockerfile功能不直接支持它,但您可以从构建的Docker映像复制文件。
Dockerfile
containerId=$(docker create example:latest) docker cp "$containerId":/source/path /destination/path docker rm "$containerId"
puruo6ea4#
也许你可以从主机上挂载一个文件夹作为一个卷,并把文件放在那里?通常挂载的卷可以从容器内写入,除非你在挂载时指定只读选项。
docker run -v ${PWD}:/<somewritablepath> -w <somewritablepath> <image> <action>
zte4gxcn5#
使用Dockerfile完成Docker构建后,以下内容对我有效:其中**/var/lib/docker/是我的设置中的Docker根目录:**。
sudo find /var/lib/docker/ -name DESIRED_FILE -type f | xargs sudo ls -hrt | tail -1 | grep tgz | xargs -i sudo cp -v '{}' PATH_ON_HOST
xam8gpfp6#
您也可以使用网络。从以下答案中的脚本开始:https://stackoverflow.com/a/58255859/836450
运行apt-get安装-y curl运行curl -F '文件=@/路径/到/文件' http://172.17.0.1:44444/请注意,至少对我来说,172.17.0.1在构建dockerfile时,www.example.com始终是主机的IP
6条答案
按热度按时间z9gpfhce1#
自2019年7月Docker 19.03.0引入“自定义构建输出”以来,这已经成为可能。有关自定义构建输出,请参阅官方文档。
若要在生成过程中启用从生成映像到主机的自定义生成输出,您需要激活BuildKit,这是一种较新的推荐向后兼容方式,可供引擎执行生成阶段。有关启用BuildKit的信息,请参见官方文档。
这可以通过两种方式实现:
1.设置环境变量
DOCKER_BUILDKIT=1
,或1.默认情况下,通过将
"features": { "buildkit": true }
添加到config json的根,在Docker引擎中设置它。来自关于自定义构建输出的官方文档:
自定义导出器允许您将构建工件导出为本地文件系统上的文件,而不是Docker映像,这对于生成本地二进制文件、代码生成等非常有用。
...
本地导出器将生成的构建文件写入客户端的一个目录中,tar导出器与之类似,但将文件作为一个单独的tarball(.tar)写入。
如果未指定类型,则该值默认为本地导出器的输出目录。
...
--output选项从目标阶段导出所有文件。仅导出特定文件的常见模式是执行多阶段构建,然后使用COPY --from将所需文件复制到新的临时阶段。
例如,示例停靠文件
跑步
输出的尾部为:
这将生成由
RUN
命令创建的本地文件out/output.txt
。从目标阶段输出所有文件
--output
选项将从目标阶段导出所有文件。因此,将非临时阶段与COPY --from
一起使用将导致无关文件复制到输出。建议将临时阶段与COPY --from
一起使用。ugmeyewa2#
不支持将文件““从Dockerfile”“复制到主机。Dockerfile只是指定如何生成映像的方法。
构建时,您有机会将文件从主机复制到正在构建的映像(使用
COPY
指令或ADD
)您还可以使用docker cp将文件从 container(已
docker run
的映像)复制到主机(实际上,cp也可以从主机复制到容器)如果你想把一些可能在构建过程中生成的文件返回到你的主机(比如调用一个生成ssl的脚本),你可以运行一个容器,从你的主机挂载一个文件夹,然后执行cp命令。
例如,请参见getcrt script。
COMMANDS
之间的所有内容都是在容器上执行的命令,包括复制到主机${HOME}/b2d/apache
文件夹上的cp
命令,在容器中作为/apache
和-v ${HOME}/b2d/apache:/apache
装载。这意味着每次您在容器中复制
/apache
上的任何内容时,您实际上是在主机上的${HOME}/b2d/apache
中复制!uttx8gqw3#
尽管
Dockerfile
功能不直接支持它,但您可以从构建的Docker映像复制文件。puruo6ea4#
也许你可以从主机上挂载一个文件夹作为一个卷,并把文件放在那里?通常挂载的卷可以从容器内写入,除非你在挂载时指定只读选项。
zte4gxcn5#
使用Dockerfile完成Docker构建后,以下内容对我有效:
其中**/var/lib/docker/是我的设置中的Docker根目录:**。
xam8gpfp6#
您也可以使用网络。从以下答案中的脚本开始:https://stackoverflow.com/a/58255859/836450
运行apt-get安装-y curl运行curl -F '文件=@/路径/到/文件' http://172.17.0.1:44444/
请注意,至少对我来说,172.17.0.1在构建dockerfile时,www.example.com始终是主机的IP