ECS EC2启动类型拉取ECR镜像devmapper空间不足如何配置存储?
问题原因核心解释
你遇到的报错是Docker的devicemapper存储池可用块不足,针对你的疑问逐一明确说明:
为什么会存在过期资源占用存储?
你理解的「每次任务使用全新完整空间」是Fargate启动类型的逻辑,EC2启动类型的ECS服务底层是复用长期运行的EC2实例的:
- 任务结束后,EC2实例上的旧容器残留、之前拉取过的镜像层默认不会自动删除,会长期保留在Docker的存储池中
- 如果你的镜像版本迭代快、或者实例上跑过的任务镜像数量多,就会逐步占满存储池空间,
docker prune的方案就是针对这类场景,清理无用的悬空镜像层、已停止的容器、未使用的卷等冗余资源。
调整ephemeral_storage参数能不能解决问题?
不能,aws_ecs_task_definition里的ephemeral_storage参数仅对Fargate启动类型的任务生效,EC2启动类型的任务存储完全依赖底层EC2实例的本地卷配置,调整该参数不会有任何效果。
具体处理方案
不需要修改任务定义,优先调整EC2实例相关配置即可:
- 首先配置自动清理规则,从根源避免空间被无用资源占满:
- 在
aws_launch_template的用户数据中加入定时执行docker system prune -af的cron任务,定期清理冗余资源 - 可以调整ECS容器代理的环境变量,开启自动镜像清理:设置
ECS_IMAGE_CLEANUP_INTERVAL(镜像清理扫描间隔)、ECS_IMAGE_MINIMUM_CLEANUP_AGE(镜像多久未使用就可以清理)、ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION(任务结束后多久清理残留容器)
- 在
- 如果清理后空间仍然不足,说明你当前实例的存储卷容量无法满足业务需求:
- 直接修改
aws_launch_template中的块设备映射配置,调大Docker存储池对应的卷容量:如果用默认配置把Docker数据存在根卷,就调大根卷的大小;如果是单独给Docker划分了thin pool数据卷,就调对应数据卷的大小 - 修改完成后触发ASG的滚动更新,用新配置的实例替换旧实例即可。
- 直接修改
额外优化建议
如果你的ECS优化AMI版本比较旧,还可以升级到最新的Amazon ECS优化AMI,默认已经改用overlay2存储驱动,相比devicemapper存储效率更高、空间占用问题更少。
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

