python - 多仓库 docker-compose
问题描述
我有两个服务,位于两个不同的 GitLab 存储库上,部署到同一主机。我目前正在使用supervisord
来运行所有服务。每个存储库的 CI/CD 将代码推送到主机。
我正在尝试supervisord
用 Docker 替换。我所做的是以下内容:
- 为每个服务设置一个
Dockerfile
。 - 创建了第三个存储库,其中只有一个
docker-compose.yml
,docker-compose up
在其 CI 中运行以构建和运行这两个服务。我希望这个存储库只部署一次。
我正在寻找一种docker-compose
在部署两种服务之一时自动更新的方法。
编辑:本质上,我试图找出docker-compose
与多存储库设置和一台主机一起使用的最佳方式。
我的docker-compose
:
version: "3.4"
services:
redis:
image: "redis:alpine"
api:
build: .
command: gunicorn -c gunicorn_conf.py --bind 0.0.0.0:5000 --chdir server "app:app" --timeout 120
volumes:
- .:/app
ports:
- "8000:8000"
depends_on:
- redis
celery-worker:
build: .
command: celery worker -A server.celery_config:celery
volumes:
- .:/app
depends_on:
- redis
celery-beat:
build: .
command: celery beat -A server.celery_config:celery --loglevel=INFO
volumes:
- .:/app
depends_on:
- redis
other-service:
build: .
command: python other-service.py
volumes:
- .:/other-service
depends_on:
- redis
解决方案
如果您在 CI 系统的上下文中进行设置,该docker-compose.yml
文件应该只运行图像;它也不应该负责构建它们。
不要使用. _volumes:
您提到每个服务的存储库都有一个Dockerfile
,这是一个正常的设置。您的 CI 系统应该在docker build
那里运行(通常是docker push
)。然后您的docker-compose.yml
文件只需要提及image:
CI 系统构建的内容:
version: "3.4"
services:
redis:
image: "redis:alpine"
api:
image: "me/django:${DJANGO_VERSION:-latest}"
ports:
- "8000:8000"
depends_on:
- redis
celery-worker:
image: "me/django:${DJANGO_VERSION:-latest}"
command: celery worker -A server.celery_config:celery
depends_on:
- redis
docker push
我在上面暗示。如果您使用 Docker Hub,或云托管的 Docker 映像存储库,或者正在运行私有存储库,CI 系统应docker push
在构建每个映像后运行,并且(如果不是 Docker Hub)image:
行需要包含存储库地址。
这里的另一个重要问题是重建时要做什么。我建议给每个构建一个唯一的 Docker 映像标签、时间戳或源代码控制提交 ID 都可以正常工作。在docker-compose.yml
上面显示的文件中,我使用环境变量来指定实际的图像标签,因此您的 CI 系统可以运行
DJANGO_VERSION=20200113.1114 docker-compose up -d
然后 Compose 将知道更改的图像标签,并能够根据新图像重新创建容器。
(这种方法在 Kubernetes 等集群系统的上下文中高度相关。将图像推送到注册表几乎是必需的。在 Kubernetes 中,更改名称image:
会触发重新部署,因此几乎需要为每个系统使用唯一的图像标签构建。除了有多个更复杂的 YAML 文件外,Kubernetes 中的整体方法与我在这里列出的非常相似。)
推荐阅读
- excel-formula - 用公式中的 NOT 函数替换 AND
- r - 计算字符串中以特定顺序出现的特定单词
- angular - 如何在Angular中自动聚焦表格行
- amazon-s3 - S3KeySensor 问题:尽管在凭证文件中传递了主机参数,但任务失败
- java - 当由 Class 类型变量调用时,getConstructor() 返回 NoSuchMethodException
- android - android.test 是否已弃用
- r - 使用 pivot_wider 后删除 tibble 中的 NA
- blazor - Blazor 组件 - 对列表参数更改做出反应
- visual-studio-code - 在 VS Code 中使用 CFLint - 似乎无法启用它?
- python - 如何更快地编写 python 代码,以便通过长时间给定的测试用例?