以下 Dockerfile
包含四个 COPY
层:
COPY README.md ./
COPY package.json ./
COPY gulpfile.js ./
COPY __BUILD_NUMBER ./
如何使用一层来复制这些文件?尝试了以下方法:
COPY [
"__BUILD_NUMBER ./",
"README.md ./",
"gulpfile ./",
"another_file ./",
]
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/* ./
如果您想在单个命令中复制目标目录下的多个目录(而不是其内容),则需要设置构建上下文,以便您的源目录位于一个共同的父目录下,然后 COPY
该父目录。
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 README.md package.json gulpfile.js __BUILD_NUMBER ./
来自doc
如果直接或由于使用通配符而指定了多个资源,则必须是目录,并且必须以斜杠 / 结尾。
原始答案警告异常处理目录。 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
文件的例外中包含的文件。
为了便于查看,您可能需要多行 COPY
命令。例如,如果要复制的文件列表很长。
反斜杠转义行尾处理如下:
COPY __BUILD_NUMBER \
README.md \
gulpfile \
another_file \
./
我可以找到用于 RUN
命令的 example with backslash,但找不到用于 COPY
。它也适用于 COPY
。
tar
存档,并使用 ADD 添加它。