gpt4 book ai didi

docker - 如何使用 Dockerfile 中的单个 COPY 层复制不同源目录和目标目录中的多个文件

转载 作者:行者123 更新时间:2023-12-02 07:03:10 24 4
gpt4 key购买 nike

我有一个如下所示的 Dockerfile:

COPY ./aaa/package.json ./aaa/package.json
COPY ./bbb/package.json ./bbb/package.json
COPY ./ccc/package.json ./ccc/package.json
WORKDIR aaa
RUN npm install
COPY ./aaa ./aaa

基本上模块aaa使用bbbccc作为本地npm模块

是否可以这样编写,使前 3 条 COPY 指令使用单个 COPY 指令完成,以便它们是 1 层而不是 3 层? (我意识到最后一个副本有第四层)

我仍然需要单独的最后一份副本。这是故意的。拆分最后一层的原因是 npm install 仅依赖于 package.json 文件,这样如果我更改源代码,则不需要重建所有层,只需重建最后一层。仅当我更改 package.json 文件时,才需要重建第一层并执行新的 npm 安装。对于使用单个模块的我来说,这是一个很好的模式,但是现在我有了一个使用本地子模块(本地 npm 模块)的主模块,我陷入了如何减少 COPY 指令的数量以减少层。该技术的完整描述记录在nodejs.org 的文章 "Dockerizing a Node.js web app" 中(并推荐)。

值得一提的是,它在技术上按原样工作,但效率很低,因为它为额外的副本创建了额外的层,而看起来应该可以以某种方式将前三个 COPY 指令组合起来以获得一层。

最佳答案

您正在尝试将其转换为多对多副本。 Dockerfile 语法不支持此功能。您需要在右侧有一个目标目录。如果您的源是一个或多个目录,您需要注意 docker 将复制这些目录的内容,而不是目录名称本身。结果就是你想要的:

COPY json-files/ ./

然后您需要使用名为 docker build . 的目录来组织构建上下文(在 .json-files 或当前目录是发送到 docker 服务器以执行构建的构建上下文)。 (可以是任何名称)仅包含要复制的目录结构中的文件:

| json-files/
|- aaa/package.json
|- bbb/package.json
\- ccc/package.json
<小时/>

选项 2:

您可以将构建构建为多阶段构建,以将其缩减为单层,而无需修改构建上下文本身:

FROM scratch as json-files
COPY ./aaa/package.json /json-files/aaa/package.json
COPY ./bbb/package.json /json-files/bbb/package.json
COPY ./ccc/package.json /json-files/ccc/package.json

FROM your_base
COPY --from=json-files /json-files .
WORKDIR aaa
RUN npm install
COPY ./aaa ./aaa

COPY 的角度来看,第二个选项与第一个选项相同。命令,它只有一个图像作为上下文,而不是使用构建命令发送的构建上下文。

<小时/>

综上所述,对于不会相互覆盖的小型单个文件,从 3 个复制命令更改为 1 个复制命令不太可能对性能产生任何明显影响,这看起来像是过早的优化。

关于docker - 如何使用 Dockerfile 中的单个 COPY 层复制不同源目录和目标目录中的多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55566422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com