【问题标题】:How to copy multiple files in different source and destination directories using a single COPY layer in Dockerfile如何使用 Dockerfile 中的单个 COPY 层复制不同源和目标目录中的多个文件
【发布时间】:2019-08-29 04:32:40
【问题描述】:

我有一个如下所示的 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 层? (我意识到最后一个 COPY 是第 4 层)

我仍然需要单独的最后一个 COPY。这是故意的。拆分出最后一层的原因是npm install只依赖于package.json文件,这样如果我改源码,就不需要重建所有层,只需要最后一层。只有当我更改 package.json 文件时,它才需要重建第一层并执行新的 npm 安装。这对我来说是一个使用单个模块的好模式,但是现在我有一个使用本地子模块(本地 npm 模块)的主模块,我被困在如何减少 COPY 指令的数量以减少层。在 nodejs.org 的文章 "Dockerizing a Node.js web app"

中记录(并推荐)了该技术的完整描述

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

【问题讨论】:

  • 此链接中已有解决方案stackoverflow.com/questions/30256386/…
  • @AbhishekDK 你能解释一下如何使用该解决方案来定位不同的文件夹吗? AFAICT 最后一个参数是唯一的输出目录,因此您无法使用该技术将 both ./aaa/ and 复制到 ./bbb/。我弄错了吗?
  • @BMitch 不。那也是不一样的。该问题涉及复制整个目录COPY dirone ./dirone,而我只从每个目录中挑选 package.json。 COPY dirone/package.json ./dirone/package.json。有很大的不同。
  • @BMitch 再次,不。这些问题都不是将单个文件从目录中提取出来。它们有很大的不同。

标签: docker dockerfile


【解决方案1】:

您正在尝试将其转换为多对多副本。 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 命令的角度来看,第二个选项与第一个选项相同,它只是将图像作为上下文,而不是通过构建命令发送的构建上下文。


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

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 2020-09-20
    • 2021-05-06
    • 2017-11-11
    • 2021-05-09
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 2011-05-05
    相关资源
    最近更新 更多