首页 > 解决方案 > 在 Dockerfile 中指定 ARG 中的多个文件到 COPY

问题描述

考虑以下 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,但这只会复制“那里”。

标签: dockercopydockerfile

解决方案


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

考虑到Dockerfile 格式提到的参数,这似乎不太可能:

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

而这不仅限于RUN.

COPY但是,还包括:

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

它不适用于您的情况。

保持多阶段构建方法

  • COPY src(所有文件夹)

  • 删除您不想要的所有内容:

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

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

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

请参阅“使用 glob 模式的DockerCOPY文件?”中的示例。


推荐阅读