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

q3qa4bjr  于 2023-02-21  发布在  Linux
关注(0)|答案(6)|浏览(204)

我想在dockerfile构建成功时获取一些文件,但它不能将文件从容器复制到主机。
这意味着当我构建dockerfile时,文件已经是宿主了。

z9gpfhce

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将所需文件复制到新的临时阶段。
例如,示例停靠文件

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

$ cat out/output.txt
hello world

从目标阶段输出所有文件

--output选项将从目标阶段导出所有文件。因此,将非临时阶段与COPY --from一起使用将导致无关文件复制到输出。建议将临时阶段与COPY --from一起使用。

ugmeyewa

ugmeyewa2#

支持将文件““从Dockerfile”“复制到主机。Dockerfile只是指定如何生成映像的方法。

构建时,您有机会将文件从主机复制到正在构建的映像(使用COPY指令或ADD
您还可以使用docker cp将文件从 container(已docker run的映像)复制到主机(实际上,cp也可以从主机复制到容器)
如果你想把一些可能在构建过程中生成的文件返回到你的主机(比如调用一个生成ssl的脚本),你可以运行一个容器,从你的主机挂载一个文件夹,然后执行cp命令。
例如,请参见getcrt script

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中复制!

uttx8gqw

uttx8gqw3#

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

containerId=$(docker create example:latest)
docker cp "$containerId":/source/path /destination/path
docker rm "$containerId"
puruo6ea

puruo6ea4#

也许你可以从主机上挂载一个文件夹作为一个卷,并把文件放在那里?通常挂载的卷可以从容器内写入,除非你在挂载时指定只读选项。

docker run -v ${PWD}:/<somewritablepath> -w <somewritablepath> <image> <action>
zte4gxcn

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
xam8gpfp

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

相关问题