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

2024-10-25 08:42:00
admin
原创
249
摘要:问题描述:我想在 dockerfile 成功构建时获取一些文件,但它不会将文件从容器复制到主机。 这意味着当我构建dockerfile时,这些文件已经是主机了。解决方案 1:自 2019 年 7 月 Docker 19.03.0 引入“自定义构建输出”以来,这一点已成为可能。请参阅有关自定义构建输出的官方文档...

问题描述:

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

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


解决方案 1:

自 2019 年 7 月 Docker 19.03.0 引入“自定义构建输出”以来,这一点已成为可能。请参阅有关自定义构建输出的官方文档。

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

可以通过两种方式实现:

  1. 设置环境变量DOCKER_BUILDKIT=1,或者

  2. "features": { "buildkit": true }通过添加到配置 json 的根目录,默认在 docker 引擎中设置它。

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

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

...

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

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

...

--output 选项会从目标阶段导出所有文件。仅导出特定文件的常见模式是进行多阶段构建,并使用 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 .

跑步

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:

解决方案 2:

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

当你构建时,你有机会将文件从主机复制到你正在构建的图像(使用COPY指令或ADD

您还可以使用docker cp将文件从容器(已被'd' 的图像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都是在容器上执行的命令,包括cp在主机文件夹上复制的命令,以及${HOME}/b2d/apache在容器内安装的命令。/apache`-v ${HOME}/b2d/apache:/apache`

/apache这意味着每次您在容器中复制任何内容时,实际上都是${HOME}/b2d/apache在主机上进行复制!

解决方案 3:

虽然它不直接通过Dockerfile功能支持,但您可以从构建的 docker 镜像中复制文件。

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

解决方案 4:

现在,使用 Docker 的插件buildx及其Local Exporter可以更轻松地实现此目的。

如果您已经按照 Docker 的教程安装了 Docker Engine 或 Desktop,那么 buildx 应该已经安装并激活为默认构建器。

它将所有内容从容器的根目录导出到主机上的本地路径,但您可以使用临时 Docker 映像进行多阶段构建来仅导出所需的内容:

#Stage 1: Build
FROM node:20-alpine AS builder

WORKDIR /build

COPY . .

RUN npm run build:doc

#Stage 2: Copy files to scratch image
FROM scratch AS export

COPY --from=builder /build/docs .

然后您需要做的就是构建--type=local, dest=<desired_path>

docker buildx build --output type=local,dest=. .

解决方案 5:

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

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

解决方案 6:

使用Dockerfile完成Docker Build后,我做了以下工作:

其中/var/lib/docker/Docker Root Dir:在我的设置中。

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

解决方案 7:

您也可以使用网络。从这个答案中的脚本开始:https ://stackoverflow.com/a/58255859/836450

  • 我在主机上运行此脚本,将其放在我希望输出到的文件夹中

  • 在我的docker里面有:

运行 apt-get install -y curl 运行 curl -F 'file=@/path/to/file' http://172.17.0.1:44444/

请注意,至少对我来说,在构建 dockerfile 时,172.17.0.1 始终是主机的 IP

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2599  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1556  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   38  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   32  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   28  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用