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?
30 answers
Há uma nova característica em Docker 1.13.x chamado Docker container prune :
docker container prune
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.
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
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)
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.
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
É agora possível utilizar a filtragem com docker ps
:
docker rm $(docker ps -q -f status=exited)
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.
~/.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.
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)
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 degrep Exited
Usardocker 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.
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.
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.
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
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
Remover todos os recipientes da janela shell:
FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i
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)
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)
Utilizar:
docker rm -f $(docker ps -a -q)
Pára com força e remove todos os contentores presentes localmente.
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.
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")
Remover 5 recipientes mais antigos:
docker rm `docker ps -aq | tail -n 5`
Vê quantos contentores restam:
docker ps -aq | wc -l
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
-
Remover todos os processos de acoplagem:
docker rm $(docker ps -a -q)
-
Remover o recipiente específico:
$ docker ps -a (lists all old containers) $ docker rm container-Id
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 .
Os passos básicos para parar / remover todos os contentores e imagens
-
Lista todos os contentores
docker ps -aq
-
Parar todos os contentores de circulação
docker stop $(docker ps -aq)
-
Remover todos os recipientes
docker rm $(docker ps -aq)
-
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).
#!/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
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.
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)
Tente este comando para limpar contentores e pendurar imagens.
docker system prune -f
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
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`
docker rm --force `docker ps -qa`
Remover todos os recipientes criados a partir de uma determinada imagem:
docker rm $(docker ps -a | awk '/myimage:mytag/{print $1}')