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

时间:2015-05-15 09:49:50

标签: dockerfile

以下Dockerfile包含四个COPY图层:

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

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

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

6 个答案:

答案 0 :(得分:275)

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

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

您还可以在源文件规范中使用通配符。 See the docs for a little more detail

目录很特别!如果你写的话

COPY dir1 dir2 ./

实际上就像

一样
COPY dir1/* dir2/* ./

如果要在单个命令中的目标目录下复制多个目录(而不是其内容),则需要设置构建上下文,以便源目录位于公共父级下,然后{{ 1}}那个父母。

答案 1 :(得分:21)

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

但这是文档的重要摘录:

  

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

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

答案 2 :(得分:6)

简单

COPY README.md  package.json gulpfile.js __BUILD_NUMBER ./
来自doc

  

如果指定了多个资源,则直接或由于   使用通配符,然后必须是一个目录,它必须   用斜杠结尾/.

答案 3 :(得分:4)

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

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

  

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

答案 4 :(得分:2)

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

反斜杠转义行尾处理如下:

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

我可以为 RUN 命令找到 example with backslash,但不能为 COPY 找到。不过它也适用于 COPY

答案 5 :(得分:1)

原始答案警告有关异常处理目录。 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 文件中的异常中包含的文件。