如何清理AWS SAM构建产生的旧容器镜像,或配置SAM自动清理此类镜像?
太懂这种磁盘突然被占满的崩溃感了!我之前用SAM开发容器化Lambda的时候,也碰到过一模一样的问题——旧镜像堆得快把硬盘撑爆,手动删起来真的麻烦。下面分享几个实用的方法,不管是手动清理还是自动配置都有:
一、手动快速清理SAM相关镜像
1. 用SAM官方命令清理缓存
SAM CLI自带了专门清理本地缓存的命令,能一键清除旧的构建缓存、下载的运行时镜像,非常省心:
sam purge
这个命令会清理SAM存储在本地的所有缓存资源,包括那些重复的nodejs-16或者其他运行时镜像,比手动一个个删高效多了。
2. 精准清理Docker中的SAM镜像
如果你想更精准地只删除SAM相关的镜像,不想动其他Docker镜像,可以用Docker命令筛选后删除:
# 列出所有SAM相关的镜像并强制删除 docker images | grep "amazon/aws-sam-cli" | awk '{print $3}' | xargs docker rmi -f
这个命令会筛选出标签包含amazon/aws-sam-cli的镜像(SAM的运行时镜像都是这个前缀),然后批量删除它们。
3. 清理所有闲置Docker资源(进阶)
如果你的Docker里还有其他闲置的镜像、容器、卷,可以用Docker的系统修剪命令一次性清理,顺带把SAM的旧镜像也处理掉:
# 清理所有闲置的镜像、容器、网络、卷(不会删除正在使用的资源) docker system prune -a
加上-a参数会删除所有未被使用的镜像,不仅仅是悬空镜像,能释放更多磁盘空间。
二、配置SAM自动清理,从根源解决问题
1. 构建时禁用缓存
每次构建的时候加上--no-cache参数,SAM就不会缓存运行时镜像,每次都会重新拉取最新版本(缺点是构建速度会变慢,适合对磁盘空间敏感的场景):
sam build --no-cache
2. 全局配置SAM自动清理
可以修改SAM的配置文件,让它每次构建后自动清理旧镜像。在你的用户目录下找到~/.samconfig.toml(如果没有就新建一个),添加以下配置:
[default.build.parameters] docker_cleanup = true
这样之后每次执行sam build,SAM都会自动清理不再需要的构建镜像,不用手动操作了。
3. 定时自动清理Docker资源
如果想更彻底,还可以用系统定时任务(比如Linux的cron,Windows的任务计划)定期运行Docker的修剪命令,比如每天凌晨清理一次24小时前的闲置镜像:
# 示例:每天凌晨2点清理24小时前的闲置镜像(Linux cron配置) 0 2 * * * docker system prune -a --filter "until=24h" -f
这个方法不仅能处理SAM的镜像,还能维护整个Docker环境的磁盘占用。
备注:内容来源于stack exchange,提问作者DavGin

