Amazon Elastic Container Service
开发人员指南 (API Version 2014-11-13)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

CannotCreateContainerError: API error (500): devmapper

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

Copy
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 容器代理配置

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

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

    Copy
    $ docker rm $(docker ps -aq)

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

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

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