amazon-web-services - 在 AWS ECS 上使用 docker-compose 进行 Continuos Deploy 的最佳实践
问题描述
我是 ECS 的新手,我对如何在 AWS ECS Fargate 中自动部署一个docker-compose
包含多个服务的文件感到有些困惑。
我能够通过以下步骤执行从 git push 到部署单个容器的端到端:
- 创建 AWS ECR
- 标记泊坞窗图像
- 创建 CodeCommit
- 创建 CodeBuild
- 创建代码部署
- 使用任务描述创建集群
- 创建管道以加入之前的所有内容并自动化直到结束。
- 完毕
但是当您拥有多项服务时会发生什么?
- 我是否必须修改
docker-compose
文件以与 ECS 兼容?如果是这样,如果整个项目都在一个文件夹中(pydanny cookiecutter 结构),我该如何分离存储库? - 我是否必须为我的每项服务创建一个 ECR 存储库
docker-compose
? - 自动化每个 ECR 的标签和推送以及其各自的部署以实现完整的端到端流程的步骤是什么?
- 如何修改卷
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
非常感谢您的帮助。
解决方案
这取决于您是否要使用 docker-compose 来执行所有操作。如果您想使用 docker-compose 构建、推送和拉取,您需要让image
docker-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
推荐阅读
- php - Laravel 8:使用 pluck() 后不能将标量值用作数组
- testing - 使用资产加载进行负载测试
- navigation - Shopify .liquid 我的菜单链接只是关闭菜单而不会将您带到链接
- powershell - Windows 调度程序不执行任务
- sql - 在 sql 中将 LIKE 和 IN 与子查询一起使用
- python - 使用条件语句 Python 映射和比较 2 列
- kdb - .Q.chk 在 hdb 上运行时会出现“类型”错误。我该如何调试或我应该检查什么?
- phpstorm - JetBrains 示波器调光功能/刺激性
- jenkins - 使用 groovy 从 Jenkins 的控制台输出中读取字符串并相应地更改邮件主题
- angular - 仅在填写后如何验证字段