CannotCreateContainerError: API error (500): devmapper - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

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

预设情况下,经 Amazon ECS 优化的 Amazon Linux AMI 从版本 2015.09.d 开始,然后后续版本中启动了 8-GiB 的卷,作为文件系统的根连接 /dev/xvda 并挂载。另外还有一个在 /dev/xvdcz 挂载并供 Docker 用于镜像和元数据存储的 22 GiB 卷。如果该存储空间被填满,则 Docker 进程守护程序将无法创建新的容器。

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

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

  • 要查看精简轮询信息,请在容器实例上运行以下命令:

    docker info
  • (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/"