Docker Compose结合AWS Fargate如何配置容器异常自动回滚策略
问题解决方案
一、当前配置未生效的原因
- Docker原生健康检查默认不会作为ECS部署失败的判定依据,ECS侧需要单独配置部署熔断规则才会在容器启动失败时终止部署
- 未配置重启策略上限,容器启动失败后会无限重启,不会触发部署失败的判定条件
- 如果使用了负载均衡,需要确保ECS服务已关联负载均衡目标组,目标组健康检查配置和容器内健康检查匹配,健康检查失败才会被ECS判定为部署失败
二、docker-compose侧配置调整
首先调整docker-compose配置,限制容器重启次数,避免无限重试:
services: web: image: AWS-Account-Id.dkr.ecr.us-east-1.amazonaws.com/my-service:2 environment: - ENV=dev ports: ["80:80"] # 新增重启策略:启动失败最多重试2次,超过后停止重启 restart: on-failure:2 healthcheck: test: ["CMD", "curl", "-f", "/status"] interval: 1m timeout: 10s retries: 2 start_period: 40s
三、CloudFormation侧配置自动回滚规则
docker-compose本身不支持自动回滚到上一个版本镜像的能力,需要在CloudFormation的ECS服务配置中添加部署熔断回滚规则,两种配置方式如下:
- 如果你直接编写CloudFormation模板部署,在
AWS::ECS::Service资源中添加如下配置:
DeploymentConfiguration: MaximumPercent: 200 MinimumHealthyPercent: 100 # 开启部署熔断和自动回滚 DeploymentCircuitBreaker: Enable: true Rollback: true
开启后当服务连续2次启动失败就会自动触发熔断,终止当前部署并回滚到上一个正常版本。
- 如果你使用Docker ECS集成功能,通过
docker compose直接部署到AWS,可以在docker-compose中添加扩展字段配置熔断规则:
x-aws-cloudformation: Resources: WebService: Properties: DeploymentConfiguration: DeploymentCircuitBreaker: Enable: true Rollback: true
四、效果验证
完成配置后重新部署新版本,若镜像存在问题启动失败:
- 容器最多重试启动2次
- ECS自动触发部署熔断,终止当前部署流程,回滚到上一个正常运行的版本
- CloudFormation部署状态会标记为失败,不会继续执行后续部署步骤
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

