在Docker

时间:2018-02-06 10:19:00

标签: django docker kubernetes celery

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

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

使用Jenkins自动部署。

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

问题是Jenkins为django app和5个芹菜工人构建了几乎相同的图像。他们唯一的区别就是切入点。 Django应用程序图像启动gunicorn,芹菜容器启动,好,芹菜。

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

我最喜欢多次构建相同的图像并在构建过程中指示入口点。

感谢您的帮助。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

不确定入口点的具体差异,但您可能会以创造性的方式使用--build-arg来传递不同的构建版本。请注意ENTRYPOINT不会插入构建参数,但您可以按照以下方式执行操作:

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