docker - Docker - 使用标签影响启动顺序
问题描述
我的 Django 应用程序使用 Celery 定期处理任务。遗憾的是,这导致有 3 个 continer(App、Celery Worker、Celery Beat),每个都有自己的启动 shell 脚本,而不是 docker 入口点脚本。所以我的想法是有一个单一的入口点脚本,它能够处理我在 docker-compose.yml 中输入的标签。根据标签,容器应该以 App、Celery Beat 或 Celery Worker 实例启动。我以前从未做过这样的实现,但我问自己这是否可能,因为我在 trafik loadblancer 项目中看到了类似的东西,例如:
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 脚本,每个服务一个?
解决方案
我不确定 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
然后,您可以使用SERVICE_TYPE
docker 入口点中的环境变量来启动特定服务。
但是(再次),拥有 3 个不同的 docker 图像并没有错。事实上,这就是容器(和微服务)的想法。您将流程封装在图像中并在容器中实例化它们。它们中的每一个都有不同的目的和生命周期。出于开发目的,您的实现没有任何问题。但在生产中,我建议将服务分离在不同的图像中。否则,您将拥有大图像,仅使用每个服务中三分之一的功能,并且硬耦合服务的生命周期。
推荐阅读
- python - Pycharm 错误 - OSError: [WinError 126] 找不到指定的模块
- processing - 如何在处理中启动 exe 文件?
- ocaml - 在 Windows 上通过 Opam 为 Coq 安装库
- python - 如何在Python中从我的x轴上的csv文件中获取所有单词
- python - 使用 python pandas 过滤 excel 数据
- qt - 如何在 QListView 上广播特定的 QString
- dockerfile - 使用官方 Nextcloud Docker 镜像,如何在 Dockerfile 中将 occ 命令作为 www-data 运行?
- javascript - 下拉菜单的自动选择值
- flutter - 用于小屏幕的 Flutter GridView 小部件
- google-chrome-extension - Chrome 扩展程序在重定向后不注入内容脚本