【问题标题】:Specify multiple files in ARG to COPY in Dockerfile在 Dockerfile 中指定 ARG 中的多个文件到 COPY
【发布时间】:2020-08-19 07:14:26
【问题描述】:

考虑以下 docker 构建上下文:

src/
  hi
  there
  bye

和 Dockerfile:

FROM ubuntu

RUN mkdir test
COPY src/hi src/there test/

这很好用,但我想制作文件列表以复制 ARG,类似于:

FROM ubuntu

ARG files

RUN mkdir test
COPY ${files} test/

不幸的是,使用docker build --build-arg files='src/hi src/there' some_path 调用失败,因为它将src/hi src/there 视为单个项目。如何将files 参数“扩展”到多个文件中进行复制?

一时兴起,我尝试多次指定文件 arg:docker build --build-arg files='src/hi' --build-arg files='src/there' some_path,但这只会复制“那里”。

【问题讨论】:

  • 您应该考虑将文件排除到另一个目录(例如 project_root/docker/....)并复制整个目录。会干净很多。
  • 欣赏这个建议,但不幸的是,这对我不起作用,因为这是先复制一些文件,然后再做一些事情,然后再复制一些其他文件的问题。重点是更好地利用缓存。文件集将根据构建类型而变化
  • 我也有同样的问题!
  • 你试过用双引号吗?比如:docker build --build-arg files="src/hi src/there" some_path

标签: docker copy dockerfile


【解决方案1】:

作为一种可能的解决方法,您可以尝试使用.dockerignore 文件

*
!src/hi
!src/there

COPY . test/

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

最后,您可能需要指定要包含在 上下文,而不是排除哪个。为此,请将 * 指定为 第一个模式,后跟一个或多个!异常模式。

更新:

.dockerignore 中使用通配符受到以下错误的限制: https://github.com/moby/moby/issues/30018

【讨论】:

    【解决方案2】:

    来自 Docker 文档,供您参考。

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

    【讨论】:

      【解决方案3】:

      因为它将src/hi src/there 视为单个项目。
      如何将 files 参数“扩展”为要复制的多个文件?

      考虑到Dockerfile format 提到的论点,这似乎不太可能:

      保留指令参数中的空格,例如RUN 之后的命令

      这不仅限于RUN

      不过,COPY 还包括:

      每个 <src> 可能包含通配符,并且将使用 Go 的 filepath.Match 规则进行匹配。

      这在你的情况下不起作用。

      保持multi-stage builds approach

      • 复制src(所有文件夹)

      • 删除所有你不想要的:

        RUN find pip ${files} -maxdepth 1 -mindepth 1 -print | xargs rm -rf
        
      • 根据第一张图像的结果状态构建您的实际图像。

      您可以将要保留的文件夹作为一个参数传递

      docker build --build-arg="files=! -path "src/hi" ! -path "src/there"" .
      

      参见“Docker COPY files using glob pattern?”中的示例。

      【讨论】:

      • 您对变量扩展作为不同的命令参数的问题提出以下两种解释: - 命令参数中保留空格:这意味着命令参数中的空格没有被修改,但与是否带有变量的空格被解释。作为包含空格的单个参数或作为由空格分隔的多个元素。 - 模式匹配遵循围棋规则:这里没有模式匹配。这些是完全指定的文件和目录。这些似乎解决了相关但不同的主题。
      • @AntoineGallix 不过,重点仍然存在:具有完整副本和后续过滤器的多阶段方法将起作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多