以下Dockerfile
包含四个COPY
图层:
COPY README.md ./
COPY package.json ./
COPY gulpfile.js ./
COPY __BUILD_NUMBER ./
如何使用一层复制这些文件?尝试了以下内容:
COPY [
"__BUILD_NUMBER ./",
"README.md ./",
"gulpfile ./",
"another_file ./",
]
答案 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
文件中的异常中包含的文件。