在Docker中使用共享基础映像时select不同的代码分支
我正在为一个代码库提供多个应用程序。 我创造了三个图像;
app-base
:
FROM ubuntu RUN apt-get install package COPY ./app-code /code-dir ...
app-foo
:
FROM app-base:latest RUN foo-specific-setup.sh
和app-buzz
非常类似于app-foo
。
这目前工作,除了我想能够为特定的代码分支和版本构build版本的app-foo
和app-buzz
。 这很容易做到这一点,为app-base
和适当的标记,但app-foo
和app-buzz
不能dynamicselect该标签,他们总是固定到app-base:latest
。
最终,我希望Jenkins自动生成这个构build过程。 我可以dynamic地重新编写Dockerfile,或者没有三个图像,并且每个应用程序只需要两个几乎不相同的Docker文件,这些文件需要手动同步(稍后增加到4或5)。 但是,这些解决scheme中的每一个都有明显的缺点
过去我曾经见过很多关于INCLUDE
语句或dynamic标签的讨论。 似乎没有任何东西。
有没有人有一个工作,干净(ISH)解决这个问题? 只要这意味着Dockerfile代码可以跨图像共享,我会很高兴。 如果这也意味着共享图像层不需要为每个应用程序重build,那么更好。
你仍然可以使用构build参数来做到这一点。
Dockerfile:
FROM ubuntu ARG APP_NAME RUN echo $APP_NAME-specific-setup.sh >> /root/test ENTRYPOINT cat /root/test
build立:
docker build --build-arg APP_NAME=foo -t foo .
跑:
$ docker run --rm foo foo-specific-setup.sh
在你的情况下,你可以使用刚刚设置的参数在RUN中运行正确的脚本。 你将有一个Dockerfile每个应用程序的基础变体,并根据构build参数运行正确的设置。
FROM ubuntu RUN apt-get install package COPY ./app-code /code-dir ARG APP_NAME RUN $APP_NAME-specific-setup.sh
设置ARG之前的任何图层在创build其他版本时都不需要重build。
然后,您可以将构build的图像分别放入每个应用程序的Docker存储库中。
如果您的应用程序需要不同的ENTRYPOINT
指令,则可ENTRYPOINT
每个应用程序指定一个APP_NAME-entrypoint.sh
,并将其重命名为APP_NAME-specific-setup.sh
entrypoint.sh
(或将其作为parameter passing给run
)。