Docker-使用标签来影响启动顺序



我的Django应用程序使用Celery定期处理任务。遗憾的是,这导致有3个continer(App、Celery Worker、Celery Beat(,每个continer都有自己的启动shell脚本,而不是docker入口点脚本。所以我的想法是有一个单一的入口点脚本,它能够处理我在docker-compose.yml中输入的标签。基于标签,容器应该以App、Celery Beat或Celery Worker实例开始。我以前从未做过这样的实现,但我问自己这是否可能,因为我在trafik loadblanc项目中看到了类似的东西,例如:

loadbalancer:
image: traefik:1.7
command: --docker
ports:
- 80:80
volumes:
- /var/run/docker.sock:/var/run/docker.sock 
networks:
- frontend
- backend
labels:
- "traefik.frontend.passHostHeader=false"
- "traefik.docker.network=frontend"
...

根据这一点,我在网上没有找到任何好的材料,也没有找到关于如何实现这样一个场景的材料,或者我认为这是否可能。smb以前是这样做的吗?还是我应该更好地使用3个单shell脚本,每个服务一个?

  1. 您可以从容器中访问标签,但它似乎不像其他选项那样直接,我不建议这样做。请参阅这个StackOverflow问题。

  2. 如果您的用例(==entrypoints(不同于相似,那么使用三个入口点或三个命令可能会更容易。

  3. 如果您的用例更相似,那么简单地使用环境变量会更容易、更清晰。

  4. 我喜欢使用的另一个很好的替代方案是创建一个接受参数的入口点shell脚本,这样就有了一个入口点,并且参数是使用command定义提供的。

标签设计用于docker引擎和其他在主机或docker编排器级别工作的应用程序,而不是容器级别。

我不确定traefik项目是如何使用该实现的。如果他们使用它,这应该是完全可能的。

但是,我建议使用环境变量而不是docker标签。建议使用环境变量来处理云原生应用程序中的配置参数。标签的使用更多地与服务元数据相关,因此您可以识别和筛选特定的服务。在你的场景中,你可以有这样的东西:

version: "3"
services:
celery-worker:
image: generic-dev-image:latest
environment:
- SERVICE_TYPE=celery-worker
celery-beat:
image: generic-dev-image:latest
environment:
- SERVICE_TYPE=celery-beat
app:
image: generic-dev-image:latest
environment:
- SERVICE_TYPE=app

然后,您可以使用docker入口点中的SERVICE_TYPE环境变量来启动特定的服务。

但是(再次(,有3个不同的docker映像没有错。事实上,这就是容器(和微服务(的概念。您将进程封装在映像中,并在容器中实例化它们。它们中的每一个都有不同的目的和生命周期。出于开发目的,您的实现没有任何问题。但在生产中,我建议将服务分离为不同的图像。否则,您就有了大图像,只使用每个服务中三分之一的功能,并硬耦合服务的生命周期。

相关内容

最新更新