在Docker

时间:2017-01-11 09:20:40

标签: jenkins docker continuous-integration

我正在容纳一个为多个应用程序提供服务的代码库。我创建了三个图像;

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-buzzapp-foo非常相似。

目前这样做,除了我希望能够为特定的代码分支和版本构建app-fooapp-buzz的版本。对app-base执行此操作很容易并且标记得当,但app-fooapp-buzz无法动态选择该标记,它们始终固定为app-base:latest

最终,我希望Jenkins自动完成这个构建过程。我可以动态地重新编写Dockerfile,或者没有三个图像,并且每个应用程序只有两个差不多但不完全相同的Dockerfiles需要手动保持同步(后来增加到4或5)。然而,这些解决方案中的每一个都有明显的缺点。

我过去曾经看过很多关于INCLUDE语句或动态标签等问题的讨论。似乎没有任何事情发生。

有没有人有这个问题的工作,干净(ish)解决方案?只要它意味着Dockerfile代码可以在图像之间共享,我会很高兴。如果它还意味着不需要为每个应用程序重建共享的图像层,那么更好。

1 个答案:

答案 0 :(得分:1)

您仍然可以使用build args来执行此操作。

Dockerfile:

FROM ubuntu
ARG APP_NAME
RUN echo $APP_NAME-specific-setup.sh >> /root/test
ENTRYPOINT cat /root/test

构建

docker build --build-arg APP_NAME=foo -t foo .

执行命令

$ docker run --rm foo
foo-specific-setup.sh

在您的情况下,您可以使用之前设置的参数在RUN中运行正确的脚本。每个基于应用程序的变体都有一个Dockerfile,并根据构建参数运行正确的设置。

FROM ubuntu

RUN apt-get install package

COPY ./app-code /code-dir
ARG APP_NAME
RUN $APP_NAME-specific-setup.sh

在创建其他版本时,无需重建设置ARG之前的任何图层。

然后,您可以将构建的图像推送到每个应用程序的独立docker存储库。

如果您的应用需要不同的ENTRYPOINT说明,则每个应用可以APP_NAME-entrypoint.sh个,并在entrypoint.sh内将其重命名为APP_NAME-specific-setup.sh(或将其作为参数传递到run)。