一步一步将Dockerfile添加或复制到不同子目录中的多个文件,保持目录结构

时间:2019-01-24 09:43:26

标签: docker dockerfile

假设我有一个这样组织的Elixir项目树:

$ tree .
.
├── apps
│   ├── a
│   │   ├── ...
│   │   └── mix.exs
│   ├── b
│   │   ├── ...
│   │   └── mix.exs
│   └── c
│       ├── ...
│       └── mix.exs
├── mix.exs
└── mix.lock

(删除了不相关的文件)

我为此项目编写的Dockerfile大致如下:

FROM bitwalker/alpine-elixir-phoenix:latest

ENV MIX_ENV=prod

# Elixir deps
# FIXME: do not hardcode apps/ subdirectories, use wildcards somehow
# FIXME: copy everything in one step somehow
ADD apps/a/mix.exs apps/a/
ADD apps/b/mix.exs apps/b/
ADD apps/c/mix.exs apps/c/
ADD mix.exs mix.lock ./
RUN mix local.hex --force && mix deps.get && mix deps.compile

<skipped>

ADD . .
RUN mix compile && mix phx.digest

CMD [ "mix", "phx.server" ]

有没有一种方法可以一步一步添加或复制所有apps/*/mix.exs,并保留其目录结构(以便每个apps/foo/mix.exs都以$WORKDIR/apps/foo/mix.exs结尾)?

据我所知,没有明显的方法可以完成我想要的事情。例如像ADD apps/*/mix.exs mix.exs mix.lock ./这样的东西只会将所有内容复制到WORKDIR中(文件会相互覆盖)。

也许有一些非显而易见的方法?

1 个答案:

答案 0 :(得分:0)

我可以想到的解决方法是在.dockerignore文件中添加以下内容

apps/**
!apps/*/mix.exs

在dockerfile中

COPY apps/ /apps
COPY mix.exs mix.lock /

甚至

COPY . /

注意

如果您不必坚持使用纯粹的dockerfile解决方案,请将docker build包装在shell脚本或makefile中,并使用cp也是一种很好的方法。