Amazon Elastic Container Service
开发人员指南 (API 版本 2014-11-13)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

CannotCreateContainerError: API error (500): devmapper

下面的 Docker 错误表示容器实例上的精简池存储已满,并且 Docker 守护程序无法创建新容器:

CannotCreateContainerError: API error (500): devmapper: Thin Pool has 4350 free data blocks which is less than minimum required 4454 free data blocks. Create more free space in thin pool or use dm.min_free_space option to change behavior

默认情况下,版本 2015.09.d 及更高版本中的经 Amazon ECS 优化的 AMI 具有一个大小为 8 GiB 的卷,用于在 /dev/xvda 处附加并挂载为文件系统的根系统。另外还有一个在 /dev/xvdcz 挂载并供 Docker 用于映像和元数据存储的 22 GiB 卷。如果该存储空间被填满,则 Docker 守护程序将无法创建新的容器。

向您的容器实例添加存储的最简单方式是终止现有实例,然后启动具有更大的数据存储卷的新实例。但如果您无法执行此操作,则可以向 Docker 使用的卷组添加存储,然后执行 存储配置中的下述步骤来扩展其逻辑卷。

如果您的容器实例存储是填满速度过快,则可采取以下几个措施来减小影响:

  • (Amazon ECS 容器代理 1.8.0 及更高版本)减少已停止或已退出的容器在您的容器实例上的保留时间。ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION 代理配置变量可设置从任务停止到 Docker 容器被删除所需等待的时间段 (默认情况下,此值为 3 小时)。这将删除 Docker 容器数据。如果此值设置得过低,您可能无法检查已停止的容器或无法在日志删除前查看它们。有关更多信息,请参阅 Amazon ECS 容器代理配置

  • 从您的容器实例中删除未运行的容器和未使用的映像。您可以使用以下示例命令来手动删除已停止的容器和未使用的映像。稍后将无法检查已删除的容器,而且必须先重新拉取已删除的映像,然后再从中启动新容器。

    要删除未运行的容器,请在容器实例上执行下面的命令:

    docker rm $(docker ps -aq)

    要删除未使用的映像,请在容器实例上执行下面的命令:

    docker rmi $(docker images -q)
  • 删除容器内未使用的数据块。您可以在任何正在运行的容器上使用下面的命令运行 fstrim 来丢弃该容器文件系统未使用的任何数据块。

    sudo sh -c "docker ps -q | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ fstrim /proc/Z/root/"