首页 > 解决方案 > 在 AWS ECS 上使用 docker-compose 进行 Continuos Deploy 的最佳实践

问题描述

我是 ECS 的新手,我对如何在 AWS ECS Fargate 中自动部署一个docker-compose包含多个服务的文件感到有些困惑。

我能够通过以下步骤执行从 git push 到部署单个容器的端到端:

  1. 创建 AWS ECR
  2. 标记泊坞窗图像
  3. 创建 CodeCommit
  4. 创建 CodeBuild
  5. 创建代码部署
  6. 使用任务描述创建集群
  7. 创建管道以加入之前的所有内容并自动化直到结束。
  8. 完毕

但是当您拥有多项服务时会发生什么?

  1. 我是否必须修改docker-compose文件以与 ECS 兼容?如果是这样,如果整个项目都在一个文件夹中(pydanny cookiecutter 结构),我该如何分离存储库?
  2. 我是否必须为我的每项服务创建一个 ECR 存储库docker-compose
  3. 自动化每个 ECR 的标签和推送以及其各自的部署以实现完整的端到端流程的步骤是什么?
  4. 如何修改卷docker-compose以在 ECS 上工作?

我使用 pydanny cookiecutter 生成的以下docker -compose 文件,它有 7 个服务:

Django+ Postgres+ Redis+ Celery+ Celeryworker+ Celerybeat+Flower

码头工人-compose.yml

version: '3'

volumes:
  local_postgres_data: {}
  local_postgres_data_backups: {}

services:
  django: &django
    build:
      context: .
      dockerfile: ./compose/local/django/Dockerfile
    image: test_cd_django
    depends_on:
      - postgres
    volumes:
      - .:/app
    env_file:
      - ./.envs/.local/.django
      - ./.envs/.local/.postgres
    ports:
      - "8000:8000"
    command: /start

  postgres:
    build:
      context: .
      dockerfile: ./compose/production/postgres/Dockerfile
    image: test_cd_postgres
    volumes:
      - local_postgres_data:/var/lib/postgresql/data
      - local_postgres_data_backups:/backups
    env_file:
      - ./.envs/.local/.postgres

  redis:
    image: redis:3.2

  celeryworker:
    <<: *django
    image: test_cd_celeryworker
    depends_on:
      - redis
      - postgres

    ports: []
    command: /start-celeryworker

  celerybeat:
    <<: *django
    image: test_cd_celerybeat
    depends_on:
      - redis
      - postgres

    ports: []
    command: /start-celerybeat

  flower:
    <<: *django
    image: test_cd_flower
    ports:
      - "5555:5555"
    command: /start-flower

非常感谢您的帮助。

标签: amazon-web-servicesdockerdocker-composeamazon-ecs

解决方案


这取决于您是否要使用 docker-compose 来执行所有操作。如果您想使用 docker-compose 构建、推送和拉取,您需要让imagedocker-compose.yml 中的块与 ECR 地址匹配。例如

image: ${ID}.dkr.ecr.${region}.amazonaws.com/${image_name}:${image_tag:-latest}

我是否必须为我的 docker-compose 的每个服务创建一个 ECR 存储库?

您不必为每个服务创建一个 ECR 存储库,而是为您构建的每个映像创建一个 ECR 存储库。在您的情况下,您不必redis为 django 和 postgres 创建存储库,因为您使用 Dockerfiles 构建它们。celeryworker 和 celerybeat 使用 django 映像启动,因此您无需为它们创建额外的存储库。

自动化每个 ECR 的标签和推送以及其各自的部署以实现完整的端到端流程的步骤是什么?

在这里我只能提供一些建议,这完全取决于您的设置。我倾向于尽可能地保持与云服务无关。您可以将图像docker-compose.yml定义如下:

services:
  postgres:
    image: ${ID}.dkr.ecr.${region}.amazonaws.com/my_postgres:${image_tag:-latest}
  django:
    image: <theID>.dkr.ecr.<theRegion>.amazonaws.com/my_django:${image_tag:-latest}

然后.env在构建过程中简单地准备一个包含您需要的信息的文件。例如

image_tag=1.2.0

如何修改 docker-compose 的卷以在 ECS 上工作?

不幸的是,我无法回答这个问题,我找到了以下答案: https ://devops.stackexchange.com/questions/6228/using-volumes-on-aws-fargate


推荐阅读