Eu bati o Docker com sobrecarga de contêiner, como removê-los?

3

Minha história

Era uma vez que eu estava ligando para o Docker de uma fila de recursos do PHP para processar milhares de arquivos de mídia. Meu código criaria um novo contêiner para cada tarefa que eu queria concluir (por exemplo, "processo", "pesquisa", "fatia" etc.). Então fui para a cama e o desastre aconteceu. Acordei com um arquivo de log de 1 TB e algumas centenas de milhares de contêineres em vários estados.

O Docker não funciona mais. Como em, quando eu digito docker version (ou docker anything para esse assunto) apenas fica lá e olha. Não consigo remover os contêineres por meio do padrão docker rm $(docker ps -a -q) porque o Docker ficou muito, muito deprimido.

Aqui estão informações relevantes sobre como estou chamando o daemon:

$> sudo docker daemon
INFO[0000] API listen on /var/run/docker.sock
INFO[0000] [graphdriver] using prior storage driver "aufs"

(Meanwhile in another terminal)
$> docker version
(insert infinite darkness here)

Minhas perguntas

  1. Como posso remover contêineres do docker se o daemon do estivador não estiver respondendo?

  2. Estou usando o Docker como um executável glorificado sendo chamado pelo código usando sua API. Quais etapas adicionais eu preciso que meu código leve para limpar depois de si mesmo no futuro?

por slifty 10.12.2015 / 01:18

1 resposta

0

Bem, eu fiz algumas escavações.

How can I remove docker containers if the docker daemon isn't responding?

No Ubuntu, os contêineres são armazenados no diretório /var/lib/docker/containers . Exclua o conteúdo desse diretório e as coisas estão muito melhores.

Além disso, para qualquer pessoa curiosa, havia cerca de 250 mil contêineres que precisavam ser removidos. Dado o número de arquivos eu tive que ir com ls /var/lib/docker/containers | xargs -n200 rm -rf

I'm using Docker as a glorified executable being called from code using their API. What extra steps do I need my code take to clean after itself in future?

Se o contêiner não for usado novamente, você deve "removê-lo" oficialmente depois de terminar. Na linha de comando, isso seria feito usando docker rm $(containername) e no código dependerá completamente de como o docker está sendo acessado.

    
por 10.12.2015 / 05:25

Tags