【问题标题】:Build the same image multiple times with different entrypoints in Docker [closed]在Docker中使用不同的入口点多次构建相同的图像[关闭]
【发布时间】:2018-07-16 08:56:11
【问题描述】:

我有一个 Django 应用程序并使用 Celery 执行后台任务。

对于部署,我使用 Docker 和 Kubernetes。

使用 Jenkins 自动部署。

一切都很好,但我觉得这可以大大优化。

问题在于 Jenkins 为 django 应用和 5 个 celery worker 构建了几乎相同的图像。他们唯一的区别是入口点。 Django 应用镜像启动 gunicorn,celery 容器启动,嗯,celery。

构建几乎相同的图像的最佳做法是什么?

我希望多次构建同一个映像并在构建过程中指明入口点。

感谢您的帮助。

【问题讨论】:

  • 如果我理解您的问题,您不是在寻找在运行时更改的单个映像,而是在寻找可以多次构建到具有不同入口点的离散映像中的单个 Dockerfile。这是正确的吗?
  • @EricSmalling 是的

标签: django docker kubernetes celery


【解决方案1】:

想到的一个选项是为所有图像使用相同的入口点,然后,例如使用环境变量,在入口点代码中有一个逻辑,将启动一个或另一个程序。这是一个非常简单的例子。

if [ $ROLE == "worker" ];then
    program_1
else
    profram_2
fi

另一个选项可能是使用相同的入口点,然后能够使用 command 参数选择确切的程序。在此处查找示例:https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/。这里有一个示例 Dockerfile 和 app-entrypoint.sh

https://github.com/bitnami/bitnami-docker-wordpress/blob/master/4/Dockerfile https://github.com/bitnami/bitnami-docker-wordpress/blob/master/4/rootfs/app-entrypoint.sh

【讨论】:

  • 感谢您的链接。他们看起来很有前途。我会尝试他们并得到结果。
  • 我选择了环境变量,因为它似乎是最简单的选择。效果很好。谢谢。
【解决方案2】:

不确定入口点的具体差异,但您可以创造性地使用--build-arg 来传递不同的构建。请注意,ENTRYPOINT 不会插入 build 参数,但您可以按照以下方式做一些事情:

ARG NAME=/some/default/value
RUN ln -s ${NAME} /executable
ENTRYPOINT ["/executable"]

...然后用类似的东西构建:

docker build --build-arg NAME=/foo/bar/baz -t baz-build:1.0 .

显然,您会相应地更改 RUN 行。

(在此向评论者提供创意:https://github.com/moby/moby/issues/18492#issuecomment-347364597

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多