我正在容纳一个为多个应用程序提供服务的代码库。我创建了三个图像;
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
非常相似。
目前这样做,除了我希望能够为特定的代码分支和版本构建app-foo
和app-buzz
的版本。对app-base
执行此操作很容易并且标记得当,但app-foo
和app-buzz
无法动态选择该标记,它们始终固定为app-base:latest
。
最终,我希望Jenkins自动完成这个构建过程。我可以动态地重新编写Dockerfile,或者没有三个图像,并且每个应用程序只有两个差不多但不完全相同的Dockerfiles需要手动保持同步(后来增加到4或5)。然而,这些解决方案中的每一个都有明显的缺点。
我过去曾经看过很多关于INCLUDE
语句或动态标签等问题的讨论。似乎没有任何事情发生。
有没有人有这个问题的工作,干净(ish)解决方案?只要它意味着Dockerfile代码可以在图像之间共享,我会很高兴。如果它还意味着不需要为每个应用程序重建共享的图像层,那么更好。
答案 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
)。