如何使用Dockerfile在一层中复制多个文件?


245

以下Dockerfile包含COPY四层:

COPY README.md ./
COPY package.json ./
COPY gulpfile.js ./
COPY __BUILD_NUMBER ./

如何使用一层复制这些文件?尝试了以下方法:

COPY [
    "__BUILD_NUMBER ./",
    "README.md ./",
    "gulpfile ./",
    "another_file ./",
]

Answers:


427
COPY README.md package.json gulpfile.js __BUILD_NUMBER ./

要么

COPY ["__BUILD_NUMBER", "README.md", "gulpfile", "another_file", "./"]

您还可以在源文件规范中使用通配符。有关更多细节,请参阅文档

目录很特别!如果你写

COPY dir1 dir2 ./

实际上就像

COPY dir1/* dir2/* ./

如果要通过单个命令在目标目录下复制多个目录(而不是目录的内容),则需要设置构建上下文,以使源目录位于一个公共父目录下,然后位于该父目录下COPY


53
请注意,如果源是目录,则会复制目录内容,而不是目录本身。
Claudiu

7
还要注意,目标目录是相同的。如果您使用不同的目的地处理许多不同的文件,那么您可能要考虑构建一个覆盖文件系统(例如chroot),然后将其转换为tar存档,并添加ADD。
tu-Restate Monica-dor duh,2016年

4
@Claudiu如何复制文件夹本身?
k0pernikus

5
@ k0pernikus您可以说COPY myDir1 ./MyDir1/
Manuel Manhart

@ manuel-manhart有谁知道我们是否可以使用Build Parameter参数化文件列表?github.com/moby/moby/issues/38532吗?
Marcello de Sales

52
COPY <all> <the> <things> <last-arg-is-destination>

但是,这是文档的重要摘录:

如果您有多个使用不同上下文的文件的Dockerfile步骤,请单独复制而不是一次全部复制。这样可以确保仅在特别需要的文件发生更改时,才使每个步骤的构建缓存无效(强制重新运行该步骤)。

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#add-or-copy


您知道我们是否可以将“所有事物”参数化吗????使用构建参数?github.com/moby/moby/issues/38532 ???
Marcello de Sales

@MarcellodeSales不确定为什么会需要它。为什么不创建没有这些文件的基础映像,然后子映像中就有复制指令-如果它们无论如何都需要定义路径,则没有太大的区别。或者,您也可以将其完全保留在映像之外,然后将其安装到容器中-您可以在.env文件中进行此配置。
Manuel Manhart

另外,您始终可以始终在现有路径上进行复制,因为文件系统是分层的,所以它将覆盖/隐藏现有内容。
Manuel Manhart

@ManuelManhart,我正在使用ONBUILD COPY构建动态参数化图像...作为平台的一部分,我隐藏了图像中需要完成的工作的复杂性,因此,这就是为什么我需要提供值的原因作为参数。
Marcello de Sales

@MarcellodeSales我不认为现在/现在还支持此功能。但是你可以使用生成的参数把它包裹,看到stackoverflow.com/questions/43654656/...
曼努埃尔·曼哈特

7

简单

COPY README.md  package.json gulpfile.js __BUILD_NUMBER ./

文档

如果直接或由于使用通配符而指定了多个资源,则该资源必须是目录,并且必须以斜杠/结尾。


6

这可能是值得一提的是,你还可以创建一个.dockerignore文件,以排除文件,您希望复制:

https://docs.docker.com/engine/reference/builder/#dockerignore-file

在Docker CLI将上下文发送到Docker守护程序之前,它将在上下文的根目录中查找名为.dockerignore的文件。如果此文件存在,则CLI会修改上下文以排除与其中的模式匹配的文件和目录。这有助于避免不必要地将较大或敏感的文件和目录发送到守护程序,并避免使用ADD或COPY将它们添加到映像中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.