下面的Dockerfile包含四个COPY层:

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

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

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

当前回答

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

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

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

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

其他回答

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

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

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

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

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

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

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

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

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

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

.dockerignore文件忽略除SRC目录,测试目录包之外的所有内容。Json文件和包锁。json文件:

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

然后Dockerfile:

COPY . ./

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

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

or

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

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

目录是特殊的!如果你写

COPY dir1 dir2 ./

这实际上就像

COPY dir1/* dir2/* ./

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

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

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

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