Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Dockerfile中的单个复制层在不同的源和目标目录中复制多个文件_Docker_Dockerfile - Fatal编程技术网

如何使用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条拷贝指令使用单个拷贝指令

我有一个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条拷贝指令使用单个拷贝指令完成,从而使它们是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同样,不是。这两个问题都不是从目录中提取单个文件。它们有着本质上的不同。