如何使用Dockerfile中的单个复制层在不同的源和目标目录中复制多个文件
我有一个Dockerfile,看起来像这样:如何使用Dockerfile中的单个复制层在不同的源和目标目录中复制多个文件,docker,dockerfile,Docker,Dockerfile,我有一个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模块 是否可以编写它,使前3条拷贝指令使用单个拷贝指令
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模块
是否可以编写它,使前3条拷贝指令使用单个拷贝指令完成,从而使它们是1层而不是3层?(我意识到最后一份有第四层)
我还需要把最后一份分开。那是故意的。拆分最后一层的原因是npm安装只依赖于package.json文件,这样,如果我更改源代码,它就不需要重建所有层,只需重建最后一层。只有当我更改package.json文件时,它才需要重建第一层并进行新的npm安装。这对我来说是一个很好的模式,使用单个模块,但是现在我有了一个使用本地子模块(本地npm模块)的主模块,我一直在研究如何减少复制指令的数量以减少层的数量。本文在nodejs.org上记录(并推荐)了对该技术的完整描述
值得一提的是,它在技术上是按原样工作的,但效率很低,因为它为额外的副本创建了额外的层,而似乎可以通过某种方式将前三个副本指令组合成一个层。您正在尝试将其转换为多对多副本。Dockerfile语法不支持这一点。您需要在右侧有一个目标目录。如果您的源是一个或多个目录,您需要知道docker将复制这些目录的内容,而不是目录名本身。结果是您想要:
COPY json-files/ ./
然后,您需要使用名为json files
(可以是任何名称)的目录组织构建上下文(在docker build中。
或当前目录是发送到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
命令视图中的第一个选项相同,它只是将一个图像作为其上下文,而不是与build命令一起发送的构建上下文
所有这些,从3个复制命令更改为1个,用于不相互覆盖的单个小文件,不太可能对您的性能产生任何明显的影响,这看起来像是过早的优化。此链接@AbhishekDK中已经有一个解决方案。您能解释一下如何使用该解决方案针对不同的文件夹吗?AFAICT最后一个参数是唯一的输出目录,因此使用该技术无法同时复制到
/aaa/
和/bbb/
。我弄错了吗?可能重复:@BMitch no。那也不一样。这个问题涉及复制整个directores,COPY dirone./dirone
,而我只从每个目录中选择package.json复制dirone/package.json./dirone/package.json
。这两个问题有很大的区别。@BMitch同样,不是。这两个问题都不是从目录中提取单个文件。它们有着本质上的不同。