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

2024-10-25 08:42:00
admin
原创
56
摘要:问题描述:我想在 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

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用