ChatGPT解决这个技术问题 Extra ChatGPT

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

以下 Dockerfile 包含四个 COPY 层:

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

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

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

s
silkfire
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 该父目录。


请注意,如果源是目录,这将复制目录内容,而不是目录本身。
另请注意,目标目录是相同的。如果您使用不同的目的地处理大量不同的文件,那么您可能需要考虑构建一个覆盖文件系统(如 chroot),然后将其转换为 tar 存档,并使用 ADD 添加它。
@Claudiu如何自己复制文件夹?
@k0pernikus 你可以说 COPY myDir1 ./MyDir1/
@manuel-manhart 有没有人知道我们是否可以使用构建参数参数化文件列表? github.com/moby/moby/issues/38532
s
swapsCAPS
COPY <all> <the> <things> <last-arg-is-destination>

但这里是文档的重要摘录:

如果您有多个 Dockerfile 步骤使用来自您的上下文的不同文件,请单独复制它们,而不是一次全部复制。这确保了每个步骤的构建缓存仅在特定需要的文件发生更改时才失效(强制重新运行该步骤)。

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


你知道我们是否可以参数化“所有的东西”???使用构建参数? github.com/moby/moby/issues/38532???
@MarcellodeSales 不确定您为什么需要它。为什么不创建一个没有这些文件的基础图像,然后子图像中有复制指令 - 如果他们需要定义路径无论如何它并没有太大的区别。或者您可以将其完全保留在图像之外,然后将其安装到容器中 - 您可以使用 .env 文件进行配置。
此外,无论如何,您始终可以复制现有路径,因为文件系统是分层的,它将重叠/隐藏预先存在的内容。
@ManuelManhart,我正在使用 ONBUILD COPY 构建动态参数化图像...作为平台的一部分,我隐藏了图像中需要执行的操作的复杂性,因此,这就是我需要提供值的原因作为参数。
@MarcellodeSales 我认为现在/尚不支持此功能。但您可以使用构建参数对其进行封装,请参阅 stackoverflow.com/questions/43654656/…
A
Aaron

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

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

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


E
Edwin O.

简单的

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

来自doc

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


r
robSE13

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


m
moudrick

为了便于查看,您可能需要多行 COPY 命令。例如,如果要复制的文件列表很长。

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

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

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


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅