下面的Dockerfile包含四个COPY层:

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

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

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

当前回答

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

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

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

其他回答

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

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

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

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

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

如果你有多个Dockerfile步骤,使用不同的文件 你的上下文,单独复制,而不是一次全部复制。这 确保每个步骤的构建缓存都是无效的(强制 步骤将重新运行),如果具体要求的文件更改。

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

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

or

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

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

目录是特殊的!如果你写

COPY dir1 dir2 ./

这实际上就像

COPY dir1/* dir2/* ./

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

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

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

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

我可以找到一个反斜杠的RUN命令的例子,但不是COPY命令。它也适用于COPY。

简单的

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

来自医生

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