All*_*en 10 linux docker dockerfile
我想在dockerfile成功构建时获取一些文件,但它不会将文件从容器复制到主机.
这意味着当我构建dockerfile时,文件已经是主机.
Ben*_*n T 35
由于 Docker 19.03.0 在 2019 年 7 月引入了“自定义构建输出”,因此现在可以实现。请参阅有关自定义构建输出的官方文档。
为了能够在构建过程中将构建映像中的结果输出到主机中,您需要激活BuildKit,这是引擎执行构建阶段的一种更新推荐的向后兼容方式。请参阅官方文档以启用 BuildKit。
这可以通过两种方式完成:
DOCKER_BUILDKIT=1"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)
构建时,您有机会将文件从主机复制到您正在构建的映像(使用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主机上复制!
尽管该Dockerfile功能不直接支持它,但您可以从构建的 docker 映像复制文件。
containerId=$(docker create example:latest)
docker cp "$containerId":/source/path /destination/path
docker rm "$containerId"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9049 次 |
| 最近记录: |