对 Amazon ECS 中的 Docker 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 优化的 Linux 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/"