AWS ECR稳定标签问题:ECS无法拉取更新后的镜像
以下是几个实用的应对方案,按场景优先级排序:
强制ECS刷新镜像关联
ECS会缓存任务定义中镜像标签对应的镜像摘要,只有当任务定义本身发生变化时,才会重新解析标签获取最新镜像。你可以在每次更新镜像后,修改任务定义的一个无关紧要的配置(比如添加/修改一个临时环境变量、微调CPU/内存配额的小数位),让ECS认为任务定义已更新,从而重新拉取1.2标签的最新镜像。
示例:给容器加一个环境变量IMAGE_REFRESH_TOKEN=202405201430,每次更新镜像就修改这个变量的取值。设置镜像拉取策略为Always
在任务定义的容器配置中,将imagePullPolicy设置为Always。默认的IfNotPresent策略会优先使用本地已缓存的镜像,而Always会强制每次启动任务时都去ECR拉取标签对应的最新镜像。
注意:这个方案会增加任务启动时的网络耗时,适合镜像体积较小或更新频率较高的场景。结合语义化补丁标签+ECR生命周期策略
保留1.2稳定标签的同时,每次更新都推送带补丁号的语义化标签(比如1.2.1、1.2.2),并同步更新1.2标签指向最新的补丁镜像。同时配置ECR生命周期策略,自动清理旧的补丁镜像(比如保留最近5个版本)。
这种方式下,你可以通过临时修改任务定义的镜像标签到最新补丁号(再改回1.2)触发ECS刷新,或者配合上面的imagePullPolicy=Always使用,兼顾稳定标签的便利性和镜像更新的及时性。通过API强制服务重新部署
利用ECR的镜像推送事件触发自动化流程(比如Lambda函数),调用ECS的UpdateServiceAPI并设置forceNewDeployment=true。这会强制ECS服务启动新的任务实例,拉取1.2标签对应的最新镜像,无需修改任务定义本身。
内容的提问来源于stack exchange,提问作者Stefan

