多存储库 docker-compose

Ada*_*old 0 python continuous-integration docker microservices 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
Run Code Online (Sandbox Code Playgroud)

Dav*_*aze 5

如果您在 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
Run Code Online (Sandbox Code Playgroud)

我在上面暗示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
Run Code Online (Sandbox Code Playgroud)

然后 Compose 将了解更改后的镜像标签,并能够根据新镜像重新创建容器。

(这种方法与 Kubernetes 等集群系统的上下文高度相关。那里几乎需要将映像推送到注册表。在 Kubernetes 中,更改名称会触发重新image:部署,因此也几乎需要为每个映像使用唯一的映像标签。构建。除了有多个且更复杂的 YAML 文件之外,Kubernetes 中的整体方法与我在这里列出的非常相似。)