Script de shell para o docker ps -a | grep para encontrar o número de certos contêineres em execução

6

Eu quero escrever um script que seja executado pelo meu servidor de desenvolvimento que removerá qualquer contêiner docker 'similar' antes de criar e executar um novo contêiner.

Abaixo está o pseudo código para o script bash que eu preciso

var name = $1
var number_of_results = # of containers returned from $(docker ps -a | grep "$name")

if(number_of_result > 0)
      docker rm -f $(docker ps -a | grep "$name")
    
por TheJediCowboy 08.07.2015 / 17:20

2 respostas

2

O script a seguir deve fazer o que você deseja:

#!/bin/bash

name=$1

matchingStarted=$(docker ps --filter="name=$name" -q | xargs)
[[ -n $matchingStarted ]] && docker stop $matchingStarted

matching=$(docker ps -a --filter="name=$name" -q | xargs)
[[ -n $matching ]] && docker rm $matching

Basicamente, ele verifica se há um contêiner em execução com o nome fornecido e o interrompe se encontrar um. Em seguida, remova qualquer contêiner com o nome fornecido.

Nota : Você pode querer adicionar alguma validação de argumento, como se usado sem argumento, este script irá parar todos os contêineres em execução e excluir todos os contêineres parados. Eu não adicionei aqui para mantê-lo simples e fácil de ler.

    
por 03.11.2015 / 10:17
2

Você precisa levar em conta pelo menos dois casos - remover contêiner interrompido, que pode ser removido com um único comando e remover contêineres em execução, em que o contêiner deve ser interrompido antes de ser excluído.

Além disso, em vez de usar grep para encontrar o nome do contêiner, eu usaria a opção filter de docker ps , assim você não acabaria usando o contêiner errado apenas porque A opção de comando corresponde ao nome que você colocou no grep. Aqui está como eu removeria qualquer contêiner de estivador semelhante, siga estritamente a seqüência abaixo -

  1. Remover contêineres em execução
for container_id in $(docker ps  --filter="name=$name" -q);do docker stop $container_id && docker rm $container_id;done
  1. Remover contêineres parados, pois paramos de executar contêineres na etapa 1.
for container_id in $(docker ps  --filter="name=$name" -q -a);do docker rm $container_id;done

A opção -a incluirá todos os contêineres, incluindo os contidos. Não usar -a , a opção padrão, incluirá apenas contêineres em execução. Então, na primeira etapa, você remove os contêineres em execução e, na segunda etapa, prossegue com os contidos. Para remover ou parar um contêiner, tudo que você precisa é o ID do contêiner, as opções -q geram apenas o ID.

    
por 09.07.2015 / 07:04