You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 21:15:03