localize e mate todas as instâncias do docker com mais de um dia

3

Eu preciso executar um comando

 docker ps -a 

que diz listas:

id    name   time
1      abc    6 weeks ago

Para matar, precisamos disparar o comando:

docker kill id

Eu preciso encontrar todos os ids e executar o comando kill em cada id que seja mais antigo que 1 dia. Como posso fazer isso?

    
por user2696466 02.03.2016 / 20:19

1 resposta

5

Alguns comandos do docker fornecem a possibilidade de ajustar o formato de saída usando o modelo go. Assim, podemos usar esse mecanismo para obter a hora de início dos contêineres em execução mais fácil de processar.

Por exemplo:

docker ps --format='{{.ID}}' \
  | xargs -n 1 -r docker inspect \
                           -f '{{.ID}} {{.State.Running}} {{.State.StartedAt}}' \
  | awk '$2 == "true" && $3 <= "'$(date -d 'yesterday' -Ins --utc \
                                     | sed 's/+0000/Z/')'" { print $1 }' \
  | xargs -r docker kill

Assumimos que o GNU xargs aqui - a opção -r instrua xargs para executar o comando apenas se houver pelo menos um argumento. Também dependemos do GNU date - o objetivo é obter a data + hora de ontem - no formato ISO com o sufixo de hora do Zulu - de modo que seja compatível com o formato de data do docker interno. Assim, ambas as datas podem ser comparadas usando a comparação de cadeias normais, porque a ordem lexcicográfica desse formato de data corresponde à ordem da data.

O comando ps docker não tem a opção -a definida porque, por padrão, docker ps mostra apenas os contêineres em execução - e só precisamos examinar os que estão em execução para matar.

Se você tiver um alias de comando do docker definido (por exemplo, alias docker='sudo /usr/bin/docker' ), será necessário substituir docker por sudo /usr/bin/docker nesse canal.

    
por 18.03.2016 / 10:43

Tags