指定ARG中的多个文件复制到Dockerfile中

问题描述 投票:0回答:4

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

docker copy dockerfile
4个回答
2
投票

因为它将

src/hi src/there
视为单个项目。
如何将文件参数“扩展”为多个文件进行复制?

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

指令参数中的空格,例如

RUN
后面的命令,将被保留

这不仅限于

RUN

然而,

COPY
还包括:

每个

<src>
可能包含通配符,匹配将使用 Go 的
filepath.Match
规则完成。

它不适用于你的情况。

保持多阶段构建方法

  • 复制

    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
使用 glob 模式的文件?”中的示例。


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


0
投票

来自 Docker 文档,供您参考。

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


0
投票

几年后我再次遇到这个问题,但现在找到了一个足够的解决方案,假设这些文件可以分为一组固定的类别。

答案基本上是结合 Docker COPY files using glob pattern?https://unix.stackexchange.com/questions/59112/preserve-directory-struct-when-moving-files-using-find 的答案

从概念上讲,其想法是在一个阶段中分离文件组,然后逐个复制每个组(或忽略它)。

代码中:

# Create dummy stage for splitting up files
FROM ubuntu as src
RUN mkdir /groups
WORKDIR /groups
RUN mkdir group1 group2
# Makes `group2` the de-facto default, can be any though
COPY src group2
RUN rsync --recursive --remove-source-files --prune-empty-dirs \
    --include='hi' \
    --include='there' \
    --exclude='*' \
    group2/ group1/

# Create the image we actually care about
FROM ubuntu
COPY --from=src /groups/group1 test/
RUN commands requiring only `group1` files
COPY --from=src /groups/group2 test/
RUN commands requiring all files
© www.soinside.com 2019 - 2024. All rights reserved.