我希望在dockerfile成功构建时获取一些文件,但它没有将文件从容器复制到主机。
这意味着当我构建dockerfile时,文件已经在主机上了。
我希望在dockerfile成功构建时获取一些文件,但它没有将文件从容器复制到主机。
这意味着当我构建dockerfile时,文件已经在主机上了。
自2019年7月Docker 19.03.0引入了“自定义构建输出”功能,现在已经成为可能。有关自定义构建输出的官方文档请查看。
要在构建过程中将构建镜像中的自定义构建输出导出到主机上,您需要启用BuildKit。这是引擎进行构建阶段的新推荐向后兼容的方法。有关启用BuildKit的官方文档,请查看。
这可以通过以下两种方式完成:
DOCKER_BUILDKIT=1
,或"features": { "buildkit": true }
添加到配置json文件的根目录中,将其默认设置为docker engine。有关自定义构建输出的官方文档如下所示:
自定义导出器允许您将构建产物导出为本地文件系统上的文件,而不是Docker镜像,这对于生成本地二进制文件、代码生成等非常有用。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
这将生成一个本地文件out/output.txt
,该文件是由RUN
命令创建的。
$ cat out/output.txt
hello world
--output
选项将从目标阶段导出所有文件。因此,如果使用非临时阶段和COPY --from
,会导致多余的文件复制到输出中。建议使用临时阶段和COPY --from
。
目前不支持Windows操作系统:
/
中获取所有文件?@Vaccano @Ben T - gfanCOPY
指令或ADD
从主机向正在构建的镜像复制文件。docker run
过的镜像)向主机复制文件(实际上,cp也可以从主机向容器复制)。
如果你想将在构建过程中生成的一些文件(例如调用脚本生成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
在COMMANDS
之间的所有内容都是在容器上执行的命令,包括那些在主机${HOME}/b2d/apache
文件夹上进行复制的cp
命令,并通过-v ${HOME}/b2d/apache:/apache
挂载到容器中作为/apache
。
这意味着每次您在容器中复制任何内容到/apache
时,实际上是在主机上的${HOME}/b2d/apache
上进行复制!
虽然不能通过 Dockerfile
功能直接支持,但是可以从已构建的 Docker 镜像中拷贝文件。
containerId=$(docker create example:latest)
docker cp "$containerId":/source/path /destination/path
docker rm "$containerId"
docker run -v ${PWD}:/<somewritablepath> -w <somewritablepath> <image> <action>
您也可以使用网络。从此答案的脚本开始:https://dev59.com/AlkS5IYBdhLWcg3wem36#58255859
我在主机上运行此脚本,将输出放在我想要的文件夹中
在我的 Docker 中:
RUN apt-get install -y curl RUN curl -F 'file=@/path/to/file' http://172.17.0.1:44444/
请注意,至少对我来说,172.17.0.1 在构建 dockerfile 时始终是主机的 IP。
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