You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 20:45:03