Solução de problemas relacionados a API error (500): devmapper do Docker no Amazon ECS - Amazon Elastic Container Service

Solução de problemas relacionados a API error (500): devmapper do Docker no Amazon ECS

O seguinte erro do Docker indica que o armazenamento de grupos thin em sua instância de contêiner está cheio e que o daemon do Docker não pode criar novos contêineres:

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

Por padrão. as AMIs do Amazon Linux otimizadas para o Amazon ECS da versão 2015.09.d e posterior são iniciadas com um volume de 8 GiB para o sistema operacional anexado a /dev/xvda e montado como a raiz do sistema de arquivos. Há um volume de 22 GiB adicionais anexado a /dev/xvdcz que o Docker usa em armazenamento de imagens e metadados. Caso o espaço de armazenamento esteja cheio, o daemon do Docker não pode criar novos contêineres.

A maneira mais fácil de adicionar armazenamento às instâncias de contêiner é encerrar as instâncias existentes e executar novas com volumes de armazenamento físico de dados maiores. Porém, se você não puder fazer isso, poderá adicionar armazenamento ao grupo de volumes que o Docker usa e estender o volume lógico seguindo os procedimentos em AMIs do Linux otimizadas para o Amazon ECS.

Caso o armazenamento de instância de contêiner esteja enchendo muito rapidamente, existem algumas ações que você pode tomar para reduzir esse efeito:

  • Para visualizar as informações de pesquisas detalhadas, execute o seguinte comando na instância de contêiner:

    docker info
  • (Agente de contêiner 1.8.0 e posterior do Amazon ECS) Reduza o tempo em que contêineres interrompidos ou encerrados permanecem nas instâncias de contêiner. A variável de configuração do agente ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION define a duração da espera desde quando uma tarefa é parada até o contêiner do Docker ser removido (por padrão, esse valor é de 3 horas). Isso remove os dados de contêiner do Docker. Caso esse valor seja definido muito baixo, você não pode inspecionar os contêineres interrompidos ou visualizar os logs antes de serem removidos. Para ter mais informações, consulte Configuração do agente de contêiner do Amazon ECS.

  • É possível remover contêineres que não estejam em execução e imagens inutilizadas das instâncias de contêiner. É possível usar os comandos de exemplo a seguir para remover manualmente os contêineres parados e as imagens inutilizadas. Os contêineres excluídos não podem ser inspecionados posteriormente e as imagens excluídas devem ser extraídas novamente antes que novos contêineres sejam iniciados a partir delas.

    Para remover contêineres que não estejam em execução, execute o seguinte comando na instância de contêiner:

    docker rm $(docker ps -aq)

    Para remover imagens não utilizadas, execute o seguinte comando na instância de contêiner:

    docker rmi $(docker images -q)
  • É possível remover blocos de dados inutilizados em contêineres. É possível usar o comando a seguir para executar fstrim em qualquer contêiner em execução e descartar todos os blocos de dados inutilizados pelo sistema de arquivos do contêiner.

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