Como remover os contentores antigos do Cais

Esta questão está relacionada com devo preocupar-me com os contentores de carga que não funcionam?.

Estou a pensar como remover contentores antigos. O {[[0]} permite-lhe remover um único, mas eu já tenho muitos. docker rm --help não dá uma opção de selecção (como todos, ou pelo nome da imagem).

talvez haja um directório no qual estes contentores são armazenados, onde posso apagá-los facilmente manualmente?

 1016
Author: Community, 2013-06-21

30 answers

Há uma nova característica em Docker 1.13.x chamado Docker container prune : docker container prune

Isto fará o que quiser e deve funcionar em todas as plataformas da mesma forma.

Existe também uma Pruna do sistema de acoplagem: docker system prune, que irá limpar contentores, imagens, volumes e redes de um só comando.

Resposta Original:

Falou-se de um comando de limpeza do Docker. Você pode encontrar a informação neste bilhete: implementar um comando "limpo" (#928)

Até que esse comando esteja disponível, você pode string comandos Docker em conjunto com outros comandos Unix para obter o que você precisa. Aqui está um exemplo de como limpar recipientes 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.

 1141
Author: Ken Cochrane, 2018-07-31 13:17:05
Outro método que obtive de Guillaume J. Charmes (crédito onde é devido):
docker rm `docker ps --no-trunc -aq`

Irá remover todos os contentores de uma forma elegante.

E por Bartosz Bilicki, para as janelas.
FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i

Para PowerShell:

docker rm @(docker ps -aq)

Uma actualização com o Docker 1.13 (T4 2016), credit to VonC (mais tarde neste tópico):

docker system prune irá apagar todos os dados não utilizados (ou seja, por ordem: contentores parados, volumes sem contentores e imagens sem recipientes).

Consulte PR 26108 e cometer 86de7c0, que são a introdução de alguns novos comandos para ajudar a facilitar a visualização de quanto espaço a janela de Encaixe daemon de dados tendo em disco e permitindo facilmente limpeza "desnecessários" excesso.

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
 589
Author: qkrijger, 2017-05-23 12:10:54

Resposta Actualizada Use docker system prune ou docker container prune agora. Ver a resposta actualizada do VonC.

Resposta Anterior Compondo várias dicas diferentes acima, a maneira mais elegante de remover todos os recipientes não em execução parece ser:

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

  • -q imprime apenas as identificações do contentor (sem cabeçalhos das colunas)
  • -f permite-lhe filtrar a sua lista de contentores impressos (neste caso, estamos a filtrar para mostrar apenas os que saíram contentores)
 390
Author: Ryan Walls, 2018-07-23 17:32:57

A forma oficial é:

docker rm `docker ps -aq`

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

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

 242
Author: Michael Neale, 2017-03-10 03:11:32

Com o acoplador 1.13 (T4 2016), agora tem:

docker system prune -a irá apagar todos os dados não utilizados (ou seja, por ordem: contentores parados, volumes sem contentores e imagens sem contentores).

docker system prune sem um irá remover (para imagens) apenas balançando imagens, ou imagens, sem uma marca, como comentou por smilebomb.

Ver PR 26108 e commit 86de7c0 , que estão a introduzir alguns novos comandos para ajudar a facilitar visualizando quanto espaço os dados do servidor do Docker estão tomando no disco e permitindo facilmente limpar o 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

AsWJV comments,

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

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

docker container prune
 110
Author: VonC, 2018-07-20 15:04:17

É agora possível utilizar a filtragem com docker ps:

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

E para as imagens :

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

No entanto, qualquer um deles fará com que docker rm ou docker rmi atires um erro quando não houver contentores correspondentes. O truque mais antigo docker rm $(docker ps -aq) foi ainda pior, pois tentou remover qualquer recipiente em execução, falhando em cada um.

Aqui está um script mais limpo para adicionar no 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
}

editar: como indicado abaixo, a resposta original foi para a remover imagens, não contentores. Atualizado para responder a ambos, incluindo novos links para documentação. Graças ao Adrian (e à resposta do Ryan)por mencionar a nova filtragem.

 100
Author: caktux, 2015-07-08 05:37:59

ACTUALIZADO 2017 (MAIS RECENTE)

docker container prune

Isto - 2017 (old) way

Para remover todos os recipientes parados

docker rm $(docker ps -a -q)

Remover todos os recipientes (parado e não parado)

docker rm  -f $(docker ps -a -q)
 89
Author: levi, 2017-09-11 19:46:24

Remover todos os recipientes parados:

docker rm $(docker ps -a | grep Exited | awk '{print $1}')

A partir do Comentário de pauk960:

Desde a versão 1.3.0 você pode usar filtros com docker ps, em vez de grep Exited Usar docker ps -a -f status=exited. E se você usar -q com ele você pode obter identificações do recipiente apenas em vez de saída completa, não precisa usar awk para isso.

 47
Author: montells, 2017-05-23 12:03:09

Se não gosta de remover todos os contentores, pode seleccionar todos os contentores criados antes ou depois de um contentor específico com docker ps --before <container-ID> ou com docker ps --since <container-ID>. Este recurso é pelo menos na versão do Docker 0.6.5.

Digamos que desenvolveu o seu sistema, e agora está a funcionar, mas ainda há vários contentores. Você deseja remover os recipientes criados antes dessa versão de trabalho. Determinar a identificação do recipiente de trabalho com docker ps.

Remover os contentores criados antes outro recipiente

docker rm $(docker ps --before 9c49c11c8d21 -q)
Outro exemplo. Já tem a sua base de dados a correr num contentor de Docker. Você desenvolveu sua aplicação para correr em outro recipiente e agora você tem uma série de contêineres desnecessários.

Remover os contentores criados após um determinado contentor

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

O carregador armazena contentores em /var/lib/docker/containers no Ubuntu. Acho que contentores extra não fazem outro mal, mas ocupam espaço em disco.

 31
Author: vesako, 2018-07-23 17:19:17

Actualização: a partir da versão 1. 13 do Docker (lançada em janeiro de 2017), poderá emitir o seguinte comando para limpar os contentores parados, os volumes não utilizados, as imagens penduradas e as redes não utilizadas:

docker system prune

Se quiser assegurar-se de que só está a apagar contentores que tenham um estado exited, use isto:

docker ps -aq -f status=exited | xargs docker rm
Da mesma forma, se você está limpando coisas do ancoradouro, você pode se livrar de imagens não marcadas, sem nome desta forma:
docker images -q --no-trunc -f dangling=true | xargs docker rmi
 29
Author: L0j1k, 2017-01-22 10:35:26

Aqui está o meu guião docker-cleanup, que remove recipientes e imagens não marcados. Por favor, verifique a fonte para quaisquer 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

 19
Author: blueyed, 2018-07-23 17:21:59

Remover todos os recipientes da janela shell:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i
 10
Author: Bartosz Bilicki, 2016-04-13 11:45:10

Primeiro, pare de correr contentores antes de tentar removê-los

Remover os recipientes de correr

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

Podias usar kill em vez de stop. No meu caso eu prefiro {[[3]} desde que eu tendem a repeti-los vs. criar um novo cada vez que eu tento desligá-los gentilmente.

Nota: tentar parar um contentor dar-lhe-á um erro:

Erro: é impossível remover um contentor em execução, por favor interrompa-o primeiro

Remover tudo recipientes

docker rm $(docker ps -a -q)
 10
Author: Ulises, 2018-07-23 17:18:01

Https://github.com/HardySimpson/docker-cleanup

Limpeza do ancoradouro

Uma pequena concha, que remove:

  • recipientes que não funcionavam há mais de um dia
  • imagens que não pertencem a nenhum contentor restante

Pretende correr como um trabalho do crontab

Funcionalidade

  • irá remover todas as imagens {[[0]}
  • se a imagem tiver várias referências de 'repo:tag' a ela, irá remover todas as referências de 'repo: tag' excepto com um contentor. Na verdade, é uma natureza de "docker rmi".
  • muitas mensagens de erro serão mostradas na tela, e você pode decidir 2>/dev/null ou não
  • aprenda alguma coisa com o docker-gc, e resolva o seu problema (não pode remover a imagem que tem um repo:tag mutliple)
 7
Author: HardySimpson, 2016-03-03 19:50:40

Utilizar:

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

Pára com força e remove todos os contentores presentes localmente.

 7
Author: Shashank G, 2017-03-10 03:55:44
Então, pessoalmente, eu recomendo fazer isso como parte de seu script de implantação para imagens e contêineres, mantendo apenas os mais recentes contêineres e imagens de n. Etiquetei as minhas imagens do acoplador com o mesmo esquema de versionamento que uso com git tag, bem como sempre marcando a última imagem do acoplador com "mais recente"."Isto significa que, sem limpar nada, as minhas imagens do ancoradouro 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 eu não quero manter todas as minhas imagens (ou recipientes) voltando para perpetuidade em todas as minhas caixas de produção. Só quero os últimos 3 ou 4 para reveses e para me livrar de tudo o resto. O unix's tail é o teu melhor amigo aqui. Uma vez que docker images e docker ps ambos ordenam por data, podemos apenas usar tail para seleccionar todos menos os três primeiros 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 confortavelmente rolar de volta sem ocupar muito espaço ou entupir coisas com imagens antigas.

Pessoalmente, Eu... mantenha apenas um recipiente na minha caixa de produção a qualquer momento, mas você pode fazer o mesmo tipo de coisa com recipientes se quiser mais:
docker rm $(docker ps -aq | tail -n +4)
Finalmente, no meu exemplo simplificado, estamos a lidar apenas com um repositório de cada vez, mas se tivesses mais, podias ficar um pouco mais sofisticado com a mesma ideia. Digamos que só quero manter as últimas três imagens de some_ repo/some_ image. Posso misturar-me com grep e awk e seguir o meu caminho:
docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print $3}' | tail -n +4)
Mais uma vez, a mesma ideia aplica-se a containers, mas você entende por este ponto então eu vou parar de dar exemplos.
 6
Author: Eli, 2018-07-23 17:25:13

Remover todos os recipientes parados.

Sudo docker rm $(sudo docker ps-A-q)

Isto irá remover todos os contentores parados, obtendo uma lista de todos os contentores com o docker ps-A-q e passando os seus ids para o docker rm. Isto não deve remover quaisquer recipientes em execução, e irá dizer-lhe que não pode remover uma imagem em execução.

Remover todas as imagens não marcadas

Agora você quer limpar as imagens antigas para salvar algum espaço.

Sudo docker rmi $(sudo docker images-q --filter "dangling=true")

 5
Author: Ric_Harvey, 2015-11-05 12:25:08

Remover 5 recipientes mais antigos:

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

Vê quantos contentores restam:

docker ps -aq | wc -l
 4
Author: Pithikos, 2014-08-08 09:32:48

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

 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
  • Os contentores que saíram há mais de uma hora foram removidos.
  • imagens que não pertencem a nenhum contentor restante depois de removidas

Suportou as configurações ambientais

Forçar a remoção de imagens que têm várias marcas

 FORCE_IMAGE_REMOVAL=1

Forçar a eliminação dos contentores

 FORCE_CONTAINER_REMOVAL=1 

Excluindo A Saída Recente Contentores e imagens da recolha de lixo

 GRACE_PERIOD_SECONDS=86400

Esta opção também impede a remoção das imagens que foram criadas a menos de GRACE_PERIOD_ segundos atrás.

Execução seca

 DRY_RUN=1

Limpeza dos volumes dos contentores órfãos CLEAN_UP_VOLUMES=1

Referência: docker-gc

Velha maneira de fazer:

Apagar os contentores antigos, sem correr

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

Apagar tudo imagens associadas a contentores para estivadores não rodados

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

Cleanup orphaned docker volumes for docker version 1.10.x e superior

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

Com base 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
 4
Author: f-society, 2016-11-20 10:51:15
  1. Remover todos os processos de acoplagem:

    docker rm $(docker ps -a -q)
    
  2. Remover o recipiente específico:

    $ docker ps -a (lists all old containers)
    
    $ docker rm container-Id
    
 4
Author: padakpadak, 2017-03-10 03:08:40

Pode usar o seguinte comando para remover os contentores que saíram:

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 no acoplador: Gist para remover os antigos contentores e imagens do acoplador .

 4
Author: urodoz, 2017-03-10 03:13:30

Os passos básicos para parar / remover todos os contentores e imagens

  1. Lista todos os contentores

    docker ps -aq

  2. Parar todos os contentores de circulação

    docker stop $(docker ps -aq)

  3. Remover todos os recipientes

    docker rm $(docker ps -aq)

  4. Remover todas as imagens

    docker rmi $(docker images -q)

Nota: primeiro tem de parar todos os contentores antes de os Remover. Também antes de remover uma imagem, você tem que parar e remover o(s) Seu (s) recipiente (s) dependente (s).

 4
Author: Murali Manchadikkal, 2018-07-23 17:46:58
#!/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
 3
Author: mckoss, 2014-05-25 23:53:22

Uso sempre docker rmi $(docker ps -a -q) para remover todas as imagens.

Pode remover a pasta /var/lib/docker/graph Quando docker rmi falhou.

 3
Author: sunny, 2017-03-10 03:07:41

Só pode remover os recipientes parados. Parem todos no início.

docker stop $(docker ps -a -q)

Depois pode remover

docker rm $(docker ps -a -q)

 3
Author: Marcin Szymczak, 2017-05-24 19:11:09

Tente este comando para limpar contentores e pendurar imagens.

docker system prune -f
 3
Author: Pal, 2018-02-08 21:58:23

Para remover todos os recipientes sem chorar:

sudo docker ps -a | grep -v CONTAINER | awk '{print $1}' | xargs --no-run-if-empty sudo docker rm -f
 2
Author: Felipe, 2015-02-06 03:11:43

Para qualquer pessoa interessada, eu peguei o exemplo de qkrijger e transformei-o em um tudo claro (parar e remover tudo)

docker stop `docker ps --no-trunc -aq` ; docker rm `docker ps --no-trunc -aq`
 2
Author: Kraig McConaghy, 2015-04-09 06:13:56
docker rm --force `docker ps -qa`
 2
Author: Sivalingam, 2016-10-24 20:57:55

Remover todos os recipientes criados a partir de uma determinada imagem:

docker rm  $(docker ps -a | awk '/myimage:mytag/{print $1}')
 2
Author: estani, 2017-03-10 03:09:41