Como posso excluir as imagens do Docker?

265

Eu tenho as seguintes imagens:

alex@alexvps:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
<none>              <none>              70c0e19168cf        5 days ago          1.069 GB
<none>              <none>              c2ce80b62174        8 days ago          399.2 MB
<none>              <none>              60afe4036d97        8 days ago          325.1 MB

e quando tento remover um deles, recebo:

alex@alexvps:~$ sudo docker rmi 60afe4036d97
Error: Conflict, 60afe4036d97 wasn't deleted
2014/01/28 00:54:00 Error: failed to remove one or more images

Como eu posso removê-los? Por que existe esse conflito?

alexyz78
fonte

Respostas:

478

Para excluir todas as imagens, use o comando fornecido

docker rmi $(docker images -q)

Para excluir todos os contêineres, use o comando fornecido

docker rm $(docker ps -a -q)

Aviso: Isso destruirá todas as suas imagens e recipientes. Não será possível restaurá-los!

Esta solução é fornecida pelo Techoverflow.net .

Ensolarado
fonte
17
Simples e direto. Também você abaixo comando para forçar remover imagens. 'docker rmi -f $ (docker images -q)'
dimuthu
37
Do Windows PowerShell é equivalentedocker images -q | %{docker rmi -f $_}
BeatingToADifferentRobot
1
Primeiro eu usei o cmd na @muheed Como responder ( stackoverflow.com/a/30475249/2747020 ) para desbloquear a remoção de algumas imagens:sudo docker ps -a -q | xargs -n 1 -I {} sudo docker rm {}
Razec Luar
1
Windows PowerShell para contentores Dockerdocker ps -a -q | %{docker rm -f $_}
Dexter
1
Como @ alexyz78 observa abaixo, agora você pode usar docker system prune. Então, para limpar tudo: docker kill $(docker ps -q)parar os contêineres seguidos por a docker system prune -aremoverá tudo - consulte stackoverflow.com/a/44309011/247708
Bharat
101

Motivo possível: o motivo pode ser que esta imagem seja usada atualmente por um contêiner em execução. Nesse caso, você pode listar os contêineres em execução, parar o contêiner relevante e remover a imagem:

docker ps
docker stop <containerid>
docker rm <containerid>
docker rmi <imageid>

Se você não conseguir encontrar o container pelo docker ps, use-o para listar todos os containers já existentes e removê-los.

docker ps -a | grep 60afe4036d97
docker rm <containerid>

Nota: Tenha cuidado para excluir todos os contêineres existentes de uma só vez, caso você use Volume-Onlycontêineres. Eles permanecem no Exitestado, mas contêm dados úteis .

Jiri
fonte
Na verdade, você receberá uma mensagem especificando isso. Talvez outra imagem seja baseada nessa? Tente remover primeiro as imagens que você criou a partir desta imagem.
Qkrijger
12
Eu era capaz de remover a imagem com sudo docker ps -a | grep Exit | awk '{print $1}' | sudo xargs docker rm(graças a github.com/dotcloud/docker/issues/3258 ) e depois comsudo docker rmi 70c0e19168cf
alexyz78
2
Cuidado ao excluir imagens no Exitestado. Se você estiver usando contêineres somente de volume de dados, eles não permanecerão em execução.
Aceofspades
1
awk pode grep:awk '/Exit/ {print $1}'
Dwight Spencer
Seus comandos jogam isso Error response from daemon: No such container: .... É difícil dizer o que deve ser substituído e o que devo substituir. Não use...
Felo Vilches
60

O motivo do erro é que, embora a imagem não tenha nenhuma tag, ainda existe um contêiner criado nessa imagem que pode estar no exitedestado. Portanto, você deve garantir que parou e excluiu todos os contêineres criados nessas imagens. O comando a seguir ajuda a remover todos os contêineres que não estão em execução:

docker rm `docker ps -aq --no-trunc --filter "status=exited"`

Agora, isso remove todas as <none>imagens não intermediárias pendentes :

docker rmi `docker images --filter 'dangling=true' -q --no-trunc`

Nota: Para parar todos os contêineres em execução:

docker stop `docker ps -q`
eldos
fonte
1
Obrigado por isso, achei a implementação mais limpa.
Joseph Sawyer
7
Tenha cuidado se você tiver contêineres de volume de dados, pois eles têm "status = encerrado". Isso significa que você perderá todos os seus dados.
31415 Johan Johan
19

No momento, a imagem pode ser usada por um contêiner em execução. Primeiro, você deve parar e remover o (s) contêiner (es).

docker stop <container-name>
docker rm <container-id>

Então você pode tentar excluir a imagem:

docker rmi <image-id>

Você deve ter certeza de que esta imagem não depende de outras imagens (caso contrário, você deve excluí-las primeiro).

Eu tive um caso estranho no qual não havia mais contêineres ainda vivos ( docker ps -anada retornou), mas não consegui excluir a imagem e sua dependência da imagem.

Para resolver esses casos especiais, você pode forçar a remoção da imagem com isso:

docker rmi -f <image-id>
madx
fonte
19

No Bash:

for i in `sudo docker images|grep \<none\>|awk '{print $3}'`;do sudo docker rmi $i;done

Isso removerá todas as imagens com o nome "<nenhum>". Achei essas imagens redundantes.

Marcell
fonte
3
Isso não responde à pergunta, mas ainda é muito útil. Obrigado.
Bin # wiederhier 17/05
5
fazer este simples comando docker images|grep \<none\>|awk '{print $3}' | xargs docker rmi, ele pode precisar de sudopermissão
Larry Cai
15

Eu encontrei a resposta neste comando:

docker images --no-trunc | grep none | awk '{print $3}' | xargs docker rmi

Eu tive seu problema ao excluir algumas imagens que estavam sendo usadas e não percebi (usando docker ps -a).

ivangoblin
fonte
9

Desde o Docker ver. 1.13.0 (janeiro de 2017), há o system prunecomando:

$ docker system prune --help

Usage:  docker system prune [OPTIONS]

Remove unused data

Options:
-a, --all     Remove all unused images not just dangling ones
-f, --force   Do not prompt for confirmation
    --help    Print usage
alexyz78
fonte
7

Além da resposta de Sunny:

Para excluir todas as imagens em uma máquina Windows (com Docker para Windows) em uma janela do PowerShell, faça:

docker images -q | %{docker rmi -f $_}

Para excluir todos os contêineres em uma máquina Windows (com Docker para Windows) em uma janela do PowerShell, faça:

docker ps -a -q | %{docker rm -f $_}
Paul Vogel
fonte
6

Primeiro, remova todos os contêineres usando o seguinte comando

sudo docker ps -a -q | xargs -n 1 -I {} sudo docker rm {}

Em seguida, remova a imagem pelo seu ID usando o seguinte comando

sudo docker rmi <image-id>
Muheed
fonte
Vale a pena notar, caso isso não seja óbvio para alguns, que isso removerá todos os contêineres do Docker em execução.
Michael Mior
4

Você deve parar / excluir todos os contêineres desnecessários criados nessas imagens primeiro.

Veja: Como remover contêineres antigos do Docker .

Depois disso, use a solução @marcell.

tgrigoryan
fonte
4

Remova todos os recipientes

docker ps -q -a | xargs docker rm

Forçar a remoção de todas as imagens do Docker

docker rmi -f $(docker images -f dangling=true -q)
Tudo é muito
fonte
4

Simplesmente você pode adicionar --forceno final do comando. Gostar:

sudo docker rmi <docker_image_id> --force

Para torná-lo mais inteligente, você pode adicionar como:

sudo docker stop $(docker ps | grep <your_container_name> | awk '{print $1}')

sudo docker rm $(docker ps | grep <your_container_name> | awk '{print $1}')

sudo docker rmi $(docker images | grep <your_image_name> | awk '{print $3}') --force

Aqui em docker ps$ 1 está a primeira coluna, ou seja, o ID do contêiner do Docker.

E docker images$ 3 é a terceira coluna, ou seja, o ID da imagem do Docker.

kushalbhattad
fonte
3

A versão mais compacta de um comando para remover todas as imagens não marcadas é:

docker rmi $(docker images | grep "^<none>" | awk '{print $"3"}')
vermelho
fonte
3

Para excluir alguma imagem do Docker, você deve executar o seguinte comando:

$ docker rmi <docker_image_id>

Portanto, para excluir todas as imagens do Docker, você pode executar o seguinte comando:

$ docker rmi $(docker images -q)

Agora, se você quiser excluir todas as imagens do Docker (incluindo imagens em uso), poderá adicionar o sinalizador -f, por exemplo:

$ docker rmi -f $(docker images -q)
José David García Rodríguez
fonte
3

Usar

docker image prune -all

ou

docker image prune -a

Remova todas as imagens pendentes. Se -afor especificado, também removerá todas as imagens não referenciadas por qualquer contêiner.

Nota: Você é solicitado a confirmar antes da remoção remover qualquer coisa, mas não é exibida uma lista do que será potencialmente removido. Além disso, docker image lsnão suporta filtragem negativa, por isso é difícil prever quais imagens serão realmente removidas.

Conforme declarado na documentação do Docker para remoção .

Dylan
fonte
1

Se você deseja limpar automaticamente / periodicamente os contêineres existentes e remover imagens e volumes que não estão em uso por um contêiner em execução, é possível fazer o download da imagem do Docker meltwater/docker-cleanup.

Dessa forma, você não precisa limpá-lo manualmente.

Apenas corra:

docker run -d -v /var/run/docker.sock:/var/run/docker.sock:rw  -v /var/lib/docker:/var/lib/docker:rw --restart=unless-stopped meltwater/docker-cleanup:latest

Ele será executado a cada 30 minutos (ou por quanto tempo você o definir usando a opção DELAY_TIME = 1800) e limpará os contêineres e imagens existentes.

Mais detalhes: https://github.com/meltwater/docker-cleanup/blob/master/README.md

Anigbo inocente
fonte