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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Dockerfile中的单个COPY层复制不同源和目标目录中的多个文件相关的知识,希望对你有一定的参考价值。

我有一个看起来像这样的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使用bbb和ccc作为本地npm模块

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

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

值得一提的是它在技术上可以正常工作,但效率很低,因为它为额外的副本创建了额外的层,因为它似乎有可能以某种方式将前三个COPY指令组合起来获得一层。

答案

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

COPY json-files/ ./

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

| 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命令视图中的第一个选项相同,它只有一个图像作为上下文而不是使用build命令发送的构建上下文。


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

以上是关于如何使用Dockerfile中的单个COPY层复制不同源和目标目录中的多个文件的主要内容,如果未能解决你的问题,请参考以下文章

Dockerfile中的COPY和ADD指令详解与比较

不得不掌握的Dockerfile基础指令

Docker学习总结(58)——Dockerfile中,ADD和COPY的区别?

Docker学习总结(58)——Dockerfile中,ADD和COPY的区别?

Dockerfile指令

我应该将 `package-lock.json` 复制到 Dockerfile 中的容器映像吗?