如何基于GitHub+AWS ECR实现Docker Compose应用自动部署?
自动化部署方案(GitHub -> ECR -> ECS Compose 重新部署)
一、前置准备
- 确认AWS账号下已创建对应4个容器的ECR仓库,重点确保Web App的ECR仓库配置正常
- 本地已验证
ecs-cli service up命令可成功部署整个应用,docker-compose.yml的容器互联、镜像地址配置无误 - 准备好拥有ECR镜像推送权限和ECS服务部署权限的AWS IAM用户凭证
二、具体实现步骤
1. 配置GitHub Actions触发规则
在GitHub仓库根目录创建.github/workflows/deploy.yml文件,设置仅当Web App代码变更时触发流程:
name: Auto Deploy to ECS on: push: branches: [ main ] # 监听主分支提交 paths: - 'web-app/**' # 限定仅Web App目录代码变更时触发
2. 存储AWS凭证到GitHub Secrets
进入GitHub仓库的Settings -> Secrets and variables -> Actions,添加以下3个Secrets:
AWS_ACCESS_KEY_ID:具备权限的IAM用户访问密钥IDAWS_SECRET_ACCESS_KEY:对应IAM用户的私有访问密钥AWS_REGION:ECR和ECS集群所在的AWS区域(如us-east-1)
3. 构建并推送Web App镜像到ECR
在Workflow中添加镜像构建推送步骤,用提交哈希作为镜像标签保证唯一性:
jobs: build-deploy: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 配置AWS凭证 uses: aws-actions/configure-aws-credentials@v4 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ${{ secrets.AWS_REGION }} - name: 登录ECR id: login-ecr uses: aws-actions/amazon-ecr-login@v2 - name: 构建并推送Web App镜像 env: ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} ECR_REPO: your-web-app-repo # 替换为你的Web App ECR仓库名 IMAGE_TAG: ${{ github.sha }} run: | docker build -t $ECR_REGISTRY/$ECR_REPO:$IMAGE_TAG ./web-app docker push $ECR_REGISTRY/$ECR_REPO:$IMAGE_TAG
4. 更新docker-compose.yml的镜像标签
动态替换docker-compose.yml中Web App的镜像标签,确保ECS拉取最新镜像:
- name: 更新docker-compose镜像标签 run: | # 替换为你的Web App在ECR的完整镜像前缀(不含标签) sed -i 's|123456789012.dkr.ecr.us-east-1.amazonaws.com/web-app:.*|123456789012.dkr.ecr.us-east-1.amazonaws.com/web-app:${{ github.sha }}|' docker-compose.yml
5. 用ecs-cli重新部署到ECS
安装ecs-cli并执行部署命令:
- name: 安装ECS CLI run: | sudo curl -Lo /usr/local/bin/ecs-cli https://amazon-ecs-cli.s3.amazonaws.com/ecs-cli-linux-amd64-latest sudo chmod +x /usr/local/bin/ecs-cli - name: 部署到ECS集群 run: | ecs-cli service up --cluster your-ecs-cluster --compose-file docker-compose.yml --service-name your-ecs-service --region ${{ secrets.AWS_REGION }} # 替换为你的ECS集群名和服务名
三、关键注意事项
- 镜像标签唯一性:使用GitHub提交哈希作为标签,避免镜像覆盖导致的缓存问题
- 权限最小化:IAM用户仅授予
ecr:GetAuthorizationToken、ecr:BatchCheckLayerAvailability、ecr:BatchGetImage、ecr:InitiateLayerUpload、ecr:UploadLayerPart、ecr:CompleteLayerUpload、ecr:PutImage(ECR推送权限)和ecs:UpdateService、ecs:DescribeServices(ECS部署权限),不要用管理员权限 - 部署验证:可在Workflow中添加步骤检查ECS服务运行状态,确保部署成功
- 扩展支持:若后续其他容器需要自动构建,只需添加对应路径监听和镜像构建推送步骤即可
内容的提问来源于stack exchange,提问作者Garvit Gulati
相关产品推荐
相关产品推荐

