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

下面的Dockerfile包含四个COPY层:

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

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

COPY [
"__BUILD_NUMBER ./",
"README.md ./",
"gulpfile ./",
"another_file ./",
]
349586 次浏览
COPY README.md package.json gulpfile.js __BUILD_NUMBER ./

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

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

目录是特殊的!如果你写

COPY dir1 dir2 ./

这实际上就像

COPY dir1/* dir2/* ./

如果你想在一个命令中复制目标目录下的多个目录(而不是它们的内容),你需要设置构建上下文,以便你的源目录在一个公共的父目录下,然后COPY该父目录下。

简单的

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

医生

如果指定了多个资源,无论是直接的还是由于 使用通配符时,则必须是目录,而且必须是目录 以斜杠/结束

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

以下是文件中的一段重要摘录:

如果你有多个Dockerfile步骤,使用不同的文件 你的上下文,单独复制,而不是一次全部复制。这 确保每个步骤的构建缓存都是无效的(强制

.如果特定的文件改变了,步骤将重新运行)

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

值得一提的是,你也可以创建一个.dockerignore文件,以排除你想要复制的文件和目录:

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

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

为了使它易于检查,你可能需要一个多行COPY命令。例如,如果要复制的文件列表很长。

反斜杠转义行尾是这样处理的:

COPY __BUILD_NUMBER    \
README.md         \
gulpfile          \
another_file      \
./

我可以为RUN命令找到带有反斜杠的示例,但不能为COPY找到。它也适用于COPY

原来的答案警告处理目录的异常。https://stackoverflow.com/a/30316600/3257491

如果你想通过包含一个或多个目录和零个或多个特定文件的目录来实现这一点,你可以使用.dockerignore:

.dockerignore文件忽略除src目录,test目录package.json文件和package-lock.json文件以外的所有内容:

*
!src
!test
!package.json
!package-lock.json

然后Dockerfile:

COPY . ./

这将只包括.dockerignore文件异常中包含的文件。