docker COPY with file globbing

时间:2016-02-27 14:25:39

标签: linux docker dockerfile

在dockerfile中,我想为globbing定义的文件指定一个复制操作,我希望它也可以用路径复制。所以,像这样:

COPY ./src/**/project.json /app/**/

考虑到我有以下结构:

./src/bar/project.json
./src/foo/project.json

目的地应如下所示:

/app/bar/project.json
/app/foo/project.json

但显然,这不起作用,如果我有机会,我真的不想单独指定所有COPY操作。知道怎么做吗?

  

请注意,我基本上无法通过.dockerignore as suggested忽略其他文件,因为我将在破坏软件包安装操作后从同一文件夹中复制其他文件。所以,dockerfile类似于:

FROM microsoft/aspnet:1.0.0-rc1-update1

COPY ./src/**/project.json /app/**/
WORKDIR /app/ModernShopping.Auth
RUN ["dnu", "restore"]
ADD ./src /app

EXPOSE 44300
ENTRYPOINT ["dnx", "web"]

3 个答案:

答案 0 :(得分:7)

对于任何非标准的构建操作,我更喜欢在脚本中包含docker build命令(名为' build')。 我会在这里

  • 创建一个子文件夹tmp(位于Dockerfile旁边,以便将其保留在docker build上下文中)
  • 使用globing cp
  • 制作外壳cp ./src/**/project.json tmp
  • 使用docker build Dockerfile
  • 致电COPY tmp/ /app/
  • 删除tmp

这样,在从主机上下文构建映像之前,我预先配置了主机所需的内容。

答案 1 :(得分:3)

解决方法

Dockerfile

COPY src/ /app/

.dockerignore

**
!**/project.json

答案 2 :(得分:1)

有点晚了,但是通过多阶段构建,您可以得到这种行为。在这里,我这样做是为了进行大型Maven构建

FROM maven:3.6-slim as staging

WORKDIR /src/
COPY . .
RUN mkdir /poms/ \
    && find ./ -type d -exec mkdir -p '/poms/{}' \; \
    && find ./ -name pom.xml -exec cp -r '{}' '/poms/{}' \;

FROM maven:3.6-slim as builder

WORKDIR /src/

COPY --from=staging /poms/* ./
RUN mvn dependency:go-offline

有点骇人听闻,但考虑到它是一个多阶段操作,第一阶段就被扔掉了,而复制是一项廉价的操作