如何使用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层复制不同源和目标目录中的多个文件的主要内容,如果未能解决你的问题,请参考以下文章
Docker学习总结(58)——Dockerfile中,ADD和COPY的区别?