none Como remover antigos contêineres Docker




docker build tag version and latest (24)

Então, pessoalmente, eu recomendo fazer isso como parte de seu script de implantação para imagens e contêineres, mantendo apenas os n recipientes e imagens mais recentes. Eu marquei minhas imagens do Docker com o mesmo esquema de controle de versão que uso com o git tag , além de sempre marcar a imagem mais recente do Docker como "mais recente". Isso significa que sem limpar nada, minhas imagens do Docker acabam parecendo:

REPOSITORY              TAG       IMAGE ID        CREATED         VIRTUAL SIZE
some_repo/some_image    0.0.5     8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    latest    8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    0.0.4     0beabfa514ea    45 hours ago    925.4 MB
some_repo/some_image    0.0.3     54302cd10bf2    6 days ago      978.5 MB
some_repo/some_image    0.0.2     0078b30f3d9a    7 days ago      978.5 MB
some_repo/some_image    0.0.1     sdfgdf0f3d9a    8 days ago      938.5 MB

Agora, é claro que não quero manter todas as minhas imagens (ou contêineres) voltando à perpetuidade em todas as minhas caixas de produção. Eu só quero os últimos 3 ou 4 para reversões e se livrar de todo o resto. A tail do Unix é sua melhor amiga aqui. Como as docker images e o docker ps são ordenados por data, podemos usar o tail para selecionar todos os três principais e removê-los:

docker rmi $(docker images -q | tail -n +4)

Execute isso junto com seus scripts de implantação (ou localmente) para sempre manter apenas imagens suficientes para reverter confortavelmente sem ocupar muito espaço ou encher coisas com imagens antigas.

Pessoalmente, eu só guardo um contêiner na minha caixa de produção a qualquer momento, mas você pode fazer o mesmo tipo de coisa com contêineres se quiser mais:

docker rm $(docker ps -aq | tail -n +4)

Finalmente, no meu exemplo simplificado, estamos lidando apenas com um repositório de cada vez, mas se você tivesse mais, você pode ficar um pouco mais sofisticado com a mesma ideia. Digamos que eu só queira manter as últimas três imagens de algum_repo / alguma_imagem. Eu posso apenas mixar grep e awk e seguir meu caminho:

docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print $3}' | tail -n +4)

Mais uma vez, a mesma ideia se aplica aos containers, mas você entende isso até o momento, então vou parar de dar exemplos.

Esta questão está relacionada a Devo preocupar-me com contêineres Docker em excesso e não em execução? .

Eu estou querendo saber como remover contêineres antigos. O docker rm 3e552code34a permite remover um único, mas já tenho muitos. docker rm --help não fornece uma opção de seleção (como todos ou por nome de imagem).

Talvez haja um diretório no qual esses contêineres sejam armazenados onde eu possa excluí-los facilmente manualmente?


Answer #1

Primeiro, pare de usar os recipientes antes de tentar removê-los

Remover contêineres em execução

docker rm $(docker stop -t=1 $(docker ps -q))

Você poderia usar kill invés de stop . No meu caso, eu prefiro stop já que eu tento repeti-los versus criar um novo a cada vez, então tento desligá-los bem.

Nota: tentar parar um contêiner lhe dará um erro:

Erro: Impossível remover um contêiner em execução. Pare primeiro

Remova todos os recipientes

docker rm $(docker ps -a -q)

Answer #2

Aqui está o meu script docker-cleanup , que remove os contêineres e imagens não marcados. Por favor, verifique a fonte para atualizações.

#!/bin/sh
# Cleanup docker files: untagged containers and images.
#
# Use `docker-cleanup -n` for a dry run to see what would be deleted.

untagged_containers() {
  # Print containers using untagged images: $1 is used with awk's print: 0=line, 1=column 1.
  docker ps -a | awk '$2 ~ "[0-9a-f]{12}" {print $'$1'}'
}

untagged_images() {
  # Print untagged images: $1 is used with awk's print: 0=line, 3=column 3.
  # NOTE: intermediate images (via -a) seem to only cause
  # "Error: Conflict, foobarid wasn't deleted" messages.
  # Might be useful sometimes when Docker messed things up?!
  # docker images -a | awk '$1 == "<none>" {print $'$1'}'
  docker images | tail -n +2 | awk '$1 == "<none>" {print $'$1'}'
}

# Dry-run.
if [ "$1" = "-n" ]; then
  echo "=== Containers with uncommitted images: ==="
  untagged_containers 0
  echo

  echo "=== Uncommitted images: ==="
  untagged_images 0

  exit
fi

# Remove containers with untagged images.
echo "Removing containers:" >&2
untagged_containers 1 | xargs --no-run-if-empty docker rm --volumes=true

# Remove untagged images
echo "Removing images:" >&2
untagged_images 3 | xargs --no-run-if-empty docker rmi

Fonte: https://github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup


Answer #3

Você pode usar o seguinte comando para remover os contêineres de saída:

docker rm $(sudo docker ps -a | grep Exit | cut -d ' ' -f 1)

Aqui está a essência completa para também remover as imagens antigas na janela de encaixe: Gist para remover contêineres e imagens antigas do Docker .


Answer #4

As etapas básicas para parar / remover todos os contêineres e imagens

  1. Listar todos os contêineres

    docker ps -aq

  2. Pare todos os contêineres em execução

    docker stop $(docker ps -aq)

  3. Remova todos os recipientes

    docker rm $(docker ps -aq)

  4. Remover todas as imagens

    docker rmi $(docker images -q)

Nota: Primeiro, você precisa parar todos os contêineres em execução antes de removê-los. Além disso, antes de remover uma imagem, você precisa parar e remover seu (s) recipiente (s) dependente (s).


Answer #5
docker rm --force `docker ps -qa`

Answer #6

Nova maneira: spotify / docker-gc é o truque.

 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
  • Os contêineres que saíram há mais de uma hora são removidos.
  • Imagens que não pertencem a nenhum recipiente restante são removidas

Suportou configurações ambientais

Forçando a exclusão de imagens com várias tags

 FORCE_IMAGE_REMOVAL=1

Forçando a exclusão de contêineres

 FORCE_CONTAINER_REMOVAL=1 

Excluindo Recipientes Recém-Saídos e Imagens da Coleta de Lixo

 GRACE_PERIOD_SECONDS=86400

Essa configuração também impede a remoção de imagens que foram criadas há menos de GRACE_PERIOD_SECONDS segundos.

Funcionamento a seco

 DRY_RUN=1

Limpando volumes de contêiner órfãos CLEAN_UP_VOLUMES = 1

Referência: docker-gc

Maneira antiga de fazer:

excluir contêineres antigos que não estão em execução

 docker ps -a -q -f status=exited | xargs --no-run-if-empty docker rm
             OR 
 docker rm $(docker ps -a -q)

excluir todas as imagens associadas a contêineres do Docker inoperantes

 docker images -q | xargs --no-run-if-empty docker rmi

Limpe os volumes do docker órfãos para o Docker versão 1.10.xe superior

 docker volume ls -qf dangling=true | xargs -r docker volume rm

Baseado no período de tempo

 docker ps -a | grep "weeks ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
 docker ps -a | grep "days ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
 docker ps -a | grep "hours ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm

Answer #7

Atualização: A partir do Docker versão 1.13 (lançado em janeiro de 2017), você pode emitir o seguinte comando para limpar contêineres interrompidos, volumes não utilizados, imagens pendentes e redes não usadas:

docker system prune

Se você quiser garantir que está apenas excluindo contêineres com status de exited , use:

docker ps -aq -f status=exited | xargs docker rm

Da mesma forma, se você estiver limpando o material do docker, poderá se livrar de imagens não identificadas e não identificadas dessa maneira:

docker images -q --no-trunc -f dangling=true | xargs docker rmi

Answer #8

Remova todos os contêineres parados.

sudo docker rm $ (sudo docker ps -a -q)

Isso removerá todos os contêineres parados, obtendo uma lista de todos os contêineres com o docker ps -a -q e passando seus IDs para o docker rm. Isso não deve remover nenhum contêiner em execução e ele informará que não é possível remover uma imagem em execução.

Remova todas as imagens não marcadas

Agora você quer limpar imagens antigas para economizar espaço.

sudo docker rmi $ (imagens do sudo docker -q --filter "dangling = true")


Answer #9

Se você não desejar remover todos os contêineres, poderá selecionar todos os contêineres criados antes ou depois de um contêiner específico com o docker ps --before <container-ID> ou com o docker ps --since <container-ID> . Esse recurso está pelo menos na versão 0.6.5 do Docker.

Digamos que você tenha desenvolvido o seu sistema e agora está funcionando, mas ainda restam alguns contêineres. Você deseja remover contêineres criados antes dessa versão de trabalho. Determine o ID do contêiner de trabalho com o docker ps .

Remover contêineres criados antes de outro contêiner

docker rm $(docker ps --before 9c49c11c8d21 -q)

Outro exemplo. Você já tem seu banco de dados em execução em um contêiner do Docker. Você desenvolveu seu aplicativo para ser executado em outro contêiner e agora você tem vários contêineres desnecessários.

Remover contêineres criados após um determinado contêiner

docker rm $(docker ps --since a6ca4661ec7f -q)

O Docker armazena contêineres em /var/lib/docker/containers no Ubuntu. Acho que contêineres extras não causam outros danos, mas ocupam espaço em disco.


Answer #10

Remova 5 recipientes mais antigos:

docker rm `docker ps -aq | tail -n 5`

Veja quantos contêineres restam:

docker ps -aq | wc -l

Answer #11

Com o Docker 1.13 (Q4 2016), você agora tem:

docker system prune -a excluirá TODOS os dados não utilizados (ou seja, em ordem: contêineres interrompidos, volumes sem contêineres e imagens sem contêineres).

docker system prune sem -a removerá (para imagens) apenas imagens pendentes ou imagens sem uma marca, como commented por smilebomb .

Veja PR 26108 e submeta o comando 86de7c0 , que está introduzindo alguns novos comandos para ajudar a facilitar a visualização do espaço que os dados do daemon do Docker estão tomando no disco e permitindo a limpeza fácil do excesso "desnecessário".

docker system prune -a

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y

Como comentários do wjv ,

Há também o docker {container,image,volume,network} prune , que pode ser usado para remover instâncias não usadas de apenas um tipo de objeto.

Introduzido no commit 913e5cb , apenas para o Docker 1.13+.

docker container prune

Answer #12
  1. Remova todos os processos do docker:

    docker rm $(docker ps -a -q)
    
  2. Remover contêiner específico:

    $ docker ps -a (lists all old containers)
    
    $ docker rm container-Id
    

Answer #13
#!/bin/bash
# docker-gc --- Remove stopped docker containers

RUNNING=$(docker ps -q)
ALL=$(docker ps -a -q)

for container in $ALL ; do
    [[ "$RUNNING" =~ "$container" ]] && continue
    echo Removing container: $(docker rm $container)
done

Answer #14

Você pode remover apenas contêineres parados. Pare todos eles no começo

docker stop $(docker ps -a -q)

Então você pode remover

docker rm $(docker ps -a -q)


Answer #15

Para qualquer pessoa interessada, peguei o exemplo do qkrijger e o transformei em tudo (pare e remova todos)

docker stop `docker ps --no-trunc -aq` ; docker rm `docker ps --no-trunc -aq`

Answer #16

Agora é possível usar a filtering com o docker ps :

docker rm $(docker ps -q -f status=exited)

E para images :

docker rmi $(docker images -q -f "dangling=true")

No entanto, qualquer um deles fará com que o docker rm ou o docker rmi um erro quando não houver contêineres correspondentes. O truque mais antigo do docker rm $(docker ps -aq) era ainda pior, pois tentava remover qualquer contêiner em execução, não conseguindo em nenhum deles.

Aqui está um script mais limpo para adicionar em seu ~/.bashrc ou ~/.profile :

# Use `docker-cleanup --dry-run` to see what would be deleted.

function docker-cleanup {
  EXITED=$(docker ps -q -f status=exited)
  DANGLING=$(docker images -q -f "dangling=true")

  if [ "$1" == "--dry-run" ]; then
    echo "==> Would stop containers:"
    echo $EXITED
    echo "==> And images:"
    echo $DANGLING
  else
    if [ -n "$EXITED" ]; then
      docker rm $EXITED
    else
      echo "No containers to remove."
    fi
    if [ -n "$DANGLING" ]; then
      docker rmi $DANGLING
    else
      echo "No images to remove."
    fi
  fi
}

Edit: Conforme observado abaixo, a resposta original foi para a remoção de imagens, não de contêineres. Atualizado para responder a ambos, incluindo novos links para documentação. Obrigado a Adrian (e a resposta de Ryan) por mencionar a nova filtragem de ps .


Answer #17

Outro método, que recebi de Guillaume J. Charmes (crédito onde é devido):

docker rm `docker ps --no-trunc -aq`

irá remover todos os recipientes de uma forma elegante.

E por Bartosz Bilicki, para o Windows:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i

Para o PowerShell:

docker rm @(docker ps -aq)

Uma atualização com o Docker 1.13 (Q4 2016), crédito para o VonC ( mais adiante neste tópico ):

docker system prune excluirá TODOS os dados não utilizados (ou seja, na ordem: contêineres interrompidos, volumes sem contêineres e imagens sem contêineres).

Veja PR 26108 e submeta o comando 86de7c0 , que está introduzindo alguns novos comandos para ajudar a facilitar a visualização do espaço que os dados do daemon do Docker estão tomando no disco e permitindo a limpeza fácil do excesso "desnecessário".

docker system prune

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y

Answer #18

Para remover TODOS os contêineres sem chorar:

sudo docker ps -a | grep -v CONTAINER | awk '{print $1}' | xargs --no-run-if-empty sudo docker rm -f

Answer #19

Resposta atualizada Use o docker system prune docker container prune ou o docker container prune agora. Veja a resposta atualizada do VonC .

Previous Answer Compondo várias dicas diferentes acima, a maneira mais elegante de remover todos os contêineres que não estão em execução parece ser:

docker rm $(docker ps -q -f status=exited)

  • -q imprime apenas os IDs do contêiner (sem cabeçalhos de coluna)
  • -f permite que você filtre sua lista de contêineres impressos (neste caso, estamos filtrando para mostrar apenas os contêineres que saíram)

Answer #20

Experimente este comando para limpar recipientes e pendurar imagens.

docker system prune -f

Answer #21

Há um novo recurso no Docker 1.13.x chamado poda do contêiner do Docker : docker container prune

Isso fará o que você quer e deve funcionar em todas as plataformas da mesma maneira.

Há também um podador do sistema Docker : poda do sistema docker system prune , que limpará contêineres, imagens, volumes e redes em um único comando.

Resposta Original:

Houve alguma conversa sobre um comando de limpeza do Docker. Você pode encontrar as informações neste ticket: Implementar um comando 'clean' (# 928)

Até que esse comando esteja disponível, você pode enviar comandos do Docker junto com outros comandos do Unix para obter o que precisa. Aqui está um exemplo de como limpar contêineres antigos com semanas de idade:

$ docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm

Para dar crédito, onde é devido, este exemplo é de https://twitter.com/jpetazzo/status/347431091415703552 .


Answer #22

Remova todos os contêineres criados a partir de uma determinada imagem:

docker rm  $(docker ps -a | awk '/myimage:mytag/{print $1}')

Answer #23

O caminho oficial é:

docker rm `docker ps -aq`

Os mantenedores do Docker indicaram que não haverá comando para isso - e você compõe os comandos assim:

Já discutimos isso antes e preferimos que os usuários usem a linha acima sem precisar adicionar código adicional ao Docker.







docker