假设我有一个这样组织的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中(文件会相互覆盖)。
也许有一些非显而易见的方法?
答案 0 :(得分:0)
我可以想到的解决方法是在.dockerignore
文件中添加以下内容
apps/**
!apps/*/mix.exs
在dockerfile中
COPY apps/ /apps
COPY mix.exs mix.lock /
甚至
COPY . /
注意
如果您不必坚持使用纯粹的dockerfile解决方案,请将docker build
包装在shell脚本或makefile中,并使用cp
也是一种很好的方法。