Docker结合EC2 ECR部署时镜像未按预期更新问题求助
问题根因与修复方案
你的镜像未按预期更新是两处配置冲突导致的,和Dockerfile本身无关,按以下步骤调整即可:
核心问题
- 你的
docker-compose.prod.yml中给web服务配置了build字段,且启动命令加了--build参数,这会让docker-compose启动时直接用EC2本地的旧代码构建镜像,完全不会使用你提前从ECR拉取的新镜像 - web服务配置了
- ..:/code的本地目录挂载,会直接覆盖镜像内部的/code目录,哪怕你正确使用了ECR镜像,里面的新代码也会被EC2上的旧本地代码覆盖 - 你没有在docker-compose配置中指定web服务使用ECR的镜像地址,docker-compose默认不会关联你拉取的ECR镜像
具体修改步骤
第一步:调整docker-compose.prod.yml配置
删除build字段、本地代码挂载,新增ECR镜像地址配置,参考修改后配置:
version: "3.8" services: web: # 替换为你的ECR镜像地址,和CI中拉取的镜像完全一致 image: ${AWS_ECR_REGISTRY}/my-repo:latest command: gunicorn vms.wsgi:application --bind 0.0.0.0:8000 # 仅保留必要的持久化卷,删除本地代码挂载 expose: - 8000 nginx: # 如果nginx镜像也推送到ECR,同理替换为ECR的nginx镜像地址,无需保留build字段 image: ${AWS_ECR_REGISTRY}/my-nginx:latest ports: - 1337:8 depends_on: - web
第二步:调整GitHub Actions启动命令
删除启动命令中的--build参数,不需要本地构建镜像:
- name: Start new container run: ssh staging 'cd vms; sudo docker-compose -f docker-compose.prod.yml up -d'
可选优化
你可以在启动命令后新增镜像清理步骤,避免EC2磁盘被旧镜像占满:
- name: Clean up old images run: ssh staging 'sudo docker image prune -af'
内容的提问来源于stack exchange,提问作者Evan
相关产品推荐
相关产品推荐

