AWS ECS部署后未运行ECR最新镜像对应源代码问题咨询
常见触发原因
- 镜像拉取策略配置不当:EC2启动类型的ECS任务默认拉取策略为
IfNotPresent,如果任务使用固定可变标签(如latest)标记镜像,EC2实例本地已缓存同标签旧镜像时,启动新任务不会重新拉取ECR上的最新版本,直接调用本地缓存镜像启动,这是该类问题最高发的诱因。 - 任务定义更新未关联到服务部署:仅修改任务定义的镜像配置但未将最新修订版的任务定义绑定到服务更新流程,服务仍在调度旧版本任务;或服务滚动部署参数配置不合理,旧版本任务未被完全替换,流量仍打到存量旧任务上。
- 可变标签导致的版本判定失效:每次构建推送都复用
latest这类固定标签,且任务定义中未显式指定镜像摘要(digest)时,ECS会判定镜像无变更,不会触发新的部署滚动流程。 - EC2实例侧Docker运行异常:实例Docker存储目录磁盘占满时,新镜像拉取失败不会触发明确的任务启动报错,Docker会自动 fallback 到本地已存的旧镜像启动容器;另外实例IAM角色缺少ECR拉取权限、VPC网络连通性问题也会导致新镜像拉取失败,转而使用本地旧镜像。
- 应用层持久化缓存干扰:如果容器挂载了宿主机目录、EFS共享卷等持久化存储,且应用启动时优先读取持久化路径下的旧代码缓存、静态资源,即使镜像本身是新版本,运行时加载的还是旧代码。
排查与解决方案
- 修正镜像拉取与版本标记规则
编辑任务定义的容器配置,将imagePullPolicy强制设置为Always,保证每次任务启动都从ECR拉取对应标签的镜像,配置参考:
长期建议放弃使用"containerDefinitions": [ { "name": "app", "image": "<你的ECR仓库URI>:<镜像标签>", "imagePullPolicy": "Always" } ]latest这类可变标签,每次构建时用Git提交短哈希、CI构建序号生成唯一镜像标签,推送镜像后在任务定义中同时指定镜像digest,彻底避免标签复用带来的缓存问题。 - 触发服务强制部署并校验版本
进入ECS服务控制台,执行更新服务操作:- 确认服务关联的任务定义为你更新了镜像的最新修订版本
- 勾选「强制新部署」选项,测试环境可临时将最小健康百分比设为0、最大百分比设为100加快替换速度,生产环境根据业务容忍度调整参数
- 部署完成后逐一检查运行中任务的任务定义修订版本、容器镜像digest,确认无存量旧版本任务留存
- 排查EC2实例侧运行环境
登录任务所在的EC2实例执行以下校验:- 执行
docker images | grep <你的镜像仓库名>,对比本地缓存镜像的digest、构建时间和ECR上最新镜像是否一致 - 执行
df -h检查/var/lib/docker挂载点的剩余空间,若空间不足则清理无用镜像、过期日志释放存储 - 手动执行
docker pull <你的ECR镜像完整URI>验证拉取流程是否正常,排查实例IAM角色的ECR权限、VPC到ECR的网络连通性是否存在异常
- 执行
- 清理应用层旧缓存
若容器挂载了持久化存储卷,进入运行中的容器检查持久化路径下的文件版本,清理残留的旧代码、静态资源缓存后重启任务,确认应用加载的是镜像内的新版本代码。
内容的提问来源于stack exchange,提问作者hsunny3993
相关产品推荐
相关产品推荐

