Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ARG中指定要在Dockerfile中复制的多个文件_Docker_Copy_Dockerfile - Fatal编程技术网

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

在ARG中指定要在Dockerfile中复制的多个文件,docker,copy,dockerfile,Docker,Copy,Dockerfile,考虑以下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/t

考虑以下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'调用某些路径
失败,因为它将
src/hi src/there
视为单个项。如何将
文件
参数“展开”到多个文件中进行复制

我一时兴起,多次尝试指定文件arg:
docker build--build arg files='src/hi'--build arg files='src/there'一些路径
,但这只复制了“there”

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

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

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

这不仅限于
运行

但也包括:

每个
可能包含通配符,将使用Go的规则进行匹配

这对你的情况不起作用

保持不变

  • 复制
    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文档中“

中的示例


如果有多个Dockerfile步骤使用上下文中的不同文件,请分别复制它们,而不是一次全部复制。这确保了每个步骤的生成缓存只有在特定要求的文件更改时才会失效(强制重新运行该步骤)。

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

*
!src/hi
!src/there

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

更新:

.dockerginore
中使用通配符受到限制,因为存在以下错误:
您应该考虑将文件排除到另一个目录中(例如,项目根目录/ DOCKER……)并复制整个目录。这会更干净。感谢你的建议,但不幸的是,这对我不起作用,因为这是一个先复制一些文件,然后做一些事情,然后再复制一些其他文件的问题。重点是更好地利用缓存。文件集将根据构建类型而变化我也有完全相同的问题!你试过用双引号吗?例如:docker build--build arg files=“src/hi src/there”对于变量扩展作为不同命令参数的问题,您提出以下两种解释:-命令参数中保留空格:这意味着命令参数中的空格不被修改,但与是否解释包含变量的空间无关。作为包含空格的单个参数或由空格分隔的多个元素。-模式匹配遵循Go的规则:这里没有模式匹配。这些是完全指定的文件和目录。这些似乎解决了相关但不同的主题。@AntoineGallix,但重点仍然是:一个包含完整副本和后续过滤器的多阶段方法将起作用。
COPY . test/