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

kaz*_*lev 199 dockerfile

以下Dockerfile包含四个COPY层次:

COPY README.md ./
COPY package.json ./
COPY gulpfile.js ./
COPY __BUILD_NUMBER ./
Run Code Online (Sandbox Code Playgroud)

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

COPY [
    "__BUILD_NUMBER ./",
    "README.md ./",
    "gulpfile ./",
    "another_file ./",
]
Run Code Online (Sandbox Code Playgroud)

Nat*_*rot 343

COPY README.md package.json gulpfile.js __BUILD_NUMBER ./
Run Code Online (Sandbox Code Playgroud)

要么

COPY ["__BUILD_NUMBER", "README.md", "gulpfile", "another_file", "./"]
Run Code Online (Sandbox Code Playgroud)

您还可以在源文件规范中使用通配符.有关详细信息,请参阅文档.

目录很特别!如果你写

COPY dir1 dir2 ./
Run Code Online (Sandbox Code Playgroud)

实际上是这样的

COPY dir1/* dir2/* ./
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,如果源是目录,则复制目录*contents*,而不是目录本身. (36认同)
  • 另请注意,目标目录是相同的.如果您使用不同的目标执行大量不同的文件,那么您可能需要考虑构建一个覆盖文件系统(如chroot),然后将其转换为`tar`存档,并将其添加到ADD中. (7认同)
  • @Claudiu如何复制文件夹本身? (4认同)
  • @ k0pernikus,您可以说COPY myDir1 ./MyDir1/ (3认同)

小智 30

COPY <all> <the> <things> <last-arg-is-destination>
Run Code Online (Sandbox Code Playgroud)

但这是文档的一个重要摘录:

如果您有多个使用上下文中不同文件的Dockerfile步骤,请单独复制它们,而不是一次复制它们.这可确保每个步骤的构建缓存仅在特定所需文件更改时失效(强制重新执行该步骤).

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


rob*_*E13 25

原始答案警告异常处理目录。/sf/answers/2122162031/

如果您想通过只包含一个或多个目录以及零个或多个特定文件的目录来实现这一目标,您可以使用.dockerignore

.dockerignorefile 忽略除src目录、test目录package.json文件和package-lock.json文件之外的所有内容:

*
!src
!test
!package.json
!package-lock.json
Run Code Online (Sandbox Code Playgroud)

然后Dockerfile

COPY . ./
Run Code Online (Sandbox Code Playgroud)

这将仅包括文件中的例外中包含的文件.dockerignore


Aar*_*ron 20

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

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

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


mou*_*ick 13

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

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

COPY __BUILD_NUMBER    \
     README.md         \
     gulpfile          \
     another_file      \
     ./
Run Code Online (Sandbox Code Playgroud)

我可以找到一个带有反斜杠的命令示例RUN,但不能找到COPY. 但它COPY也适用。


Edw*_*kwu 6

简单

COPY README.md  package.json gulpfile.js __BUILD_NUMBER ./
Run Code Online (Sandbox Code Playgroud)

文档

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