如何将更新后的容器镜像推送至AWS ECR并解决镜像不更新问题
ECR镜像推送不更新Lambda问题解决方案
标签概念澄清
你提到的两类标签是完全不同的概念:
- AWS资源标签:附加在ECR仓库、Lambda函数等云资源上的键值对,仅用于资源分类、权限管控、计费统计,和镜像本身的版本无关
- ECR镜像标签:Docker原生的镜像版本标记,你正在使用的
latest就是最常用的可变标签,用于标识镜像的不同版本,和云资源标签没有任何关联
镜像推送后不生效的核心原因
Lambda使用容器镜像部署时,会固定你首次部署时指定镜像的唯一哈希摘要(digest),即使你给同一个标签(比如latest)推送了新的镜像,Lambda默认不会主动检测更新拉取新镜像,这是最常见的不生效原因。
还有一个你命令里的笔误也可能导致问题:你提供的构建命令里docker build -T CONTAINER-NAME .参数错误,正确的打标签参数是小写的-t,大写-T不会生成带指定标签的本地镜像,后续tag、push操作实际操作的都是旧的本地镜像,自然推上去的还是旧版本。
修复步骤
- 验证镜像是否成功推送到ECR
运行命令查看最新latest标签的推送时间:
aws ecr describe-images --repository-name CONTAINER-NAME --image-ids imageTag=latest
如果返回的imagePushedAt和你最新推送的时间一致,证明推送正常,直接执行下一步;如果时间不对,先修正构建命令的参数为小写-t重新构建。
2. 手动更新Lambda的镜像版本
运行命令触发Lambda拉取最新镜像部署:
aws lambda update-function-code \ --function-name 替换为你的Lambda函数名称 \ --image-uri 1234.dkr.ecr.us-west-2.amazonaws.com/CONTAINER-NAME:latest
无需全量构建推送的优化方案
不需要切换SAM也可以提速:Docker自带镜像层缓存机制,只要基础镜像、依赖配置没有变更,仅修改业务代码的情况下,构建只会生成变更的代码层,推送也只会上传变更层。你可以在构建命令里加缓存参数,即使本地没有旧镜像缓存也可以复用ECR上的已有镜像层:
docker build --cache-from 1234.dkr.ecr.us-west-2.amazonaws.com/CONTAINER-NAME:latest -t CONTAINER-NAME .
自定义标签报错的解决方法
如果你要使用latest之外的自定义标签,仅修改镜像标签部分即可,不要修改ECR仓库名称,否则会提示仓库不存在,示例流程:
# 给本地镜像打自定义标签 docker tag CONTAINER-NAME:latest 1234.dkr.ecr.us-west-2.amazonaws.com/CONTAINER-NAME:v1.0.1 # 推送自定义标签镜像 docker push 1234.dkr.ecr.us-west-2.amazonaws.com/CONTAINER-NAME:v1.0.1 # 部署自定义标签镜像到Lambda aws lambda update-function-code \ --function-name 替换为你的Lambda函数名称 \ --image-uri 1234.dkr.ecr.us-west-2.amazonaws.com/CONTAINER-NAME:v1.0.1
内容的提问来源于stack exchange,提问作者thumbtackthief
相关产品推荐
相关产品推荐

