首页 > 解决方案 > 多仓库 docker-compose

问题描述

我有两个服务,位于两个不同的 GitLab 存储库上,部署到同一主机。我目前正在使用supervisord来运行所有服务。每个存储库的 CI/CD 将代码推送到主机。

我正在尝试supervisord用 Docker 替换。我所做的是以下内容:

  1. 为每个服务设置一个Dockerfile
  2. 创建了第三个存储库,其中只有一个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

标签: pythondockerdocker-composecontinuous-integrationmicroservices

解决方案


如果您在 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 中的整体方法与我在这里列出的非常相似。)


推荐阅读