在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-fooapp-buzz 。 这很容易做到这一点,为app-base和适当的标记,但app-fooapp-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 )。