我有一个Django应用程序,并使用Celery进行后台任务。
对于部署,我使用Docker和Kubernetes。
使用Jenkins自动部署。
一切都很好,但我觉得这可以大大优化。
问题是Jenkins为django app和5个芹菜工人构建了几乎相同的图像。他们唯一的区别就是切入点。 Django应用程序图像启动gunicorn,芹菜容器启动,好,芹菜。
构建几乎相同的图像的最佳做法是什么?
我最喜欢多次构建相同的图像并在构建过程中指示入口点。
感谢您的帮助。
答案 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)