Jak usunąć obrazy dockera na podstawie nazwy?

93

Chcę usunąć wszystkie wersje obrazów dockera z nazwami, które zawierają dany ciąg ( imagename).
Wypróbowałem poniższe, ale wydaje się, że nie działa:

docker images | grep 'imagename' | xargs -I {} docker rmi

Aditya Singh
źródło

Odpowiedzi:

136

Spróbuj wykonać następujące czynności:

docker rmi $(docker images |grep 'imagename')

Windows Powershell:

docker rmi $(docker images --format "{{.Repository}}:{{.Tag}}"|findstr "imagename")
Wędrowiec
źródło
17
Obecna wersja Dockera obsługuje to (bez grepa): docker rmi $ (obrazy dockera „nazwa obrazu”)
Charlie
Obecna wersja Dockera wydaje się to obsługiwać - może czegoś mi brakuje? - docker rmi 'imagename'
Charlie
10
@Charlie Myślę, że większość ludzi szuka sposobu na dopasowanie wszystkich obrazów pasujących do „ nazwy obrazu ” zamiast pojedynczego obrazu o nazwie „nazwa obrazu”.
RJFalconer
1
Otrzymuję następujący błąd: „docker rmi wymaga co najmniej 1 argumentu”.
michali
@michali Oznacza to, że nie został zwrócony żaden pasujący obraz. Czy możesz sprawdzić, czy istnieje pasujący wpis, po prostu uruchamiając:docker images |grep 'imagename'
Rambler
71

Nieco dokładniejsza wersja - grepowanie tylko po nazwie repozytorium:

docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
Elton Stoneman
źródło
25
to usuwa tylko obrazy oznaczone jako najnowszedocker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
Drew
Dziękuję Ci! To było to, czego szukałem.
Hardhik
26
docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
theoneandonlyak
źródło
1
Czy możesz wyjaśnić, co to robi? Fragmenty losowego kodu mogą być niebezpieczne.
kilodżule
6
docker images --format '{{.Repository}}:{{.Tag}}filtruje dane wyjściowe, więc pokazywane są tylko repozytoria i znaczniki (tj foo:latest.). grep 'imagenamefiltruje te wiersze tylko do obrazów, które zawierają imagename. Wstawienie tego $()ocenia to i przechodzi na zewnątrz, docker rmico usuwa te obrazy, które zostały dopasowane.
Adam Parkin,
Rozwijając powyższe, możesz usunąć wszystkie otagowane obrazy odpowiadające dokładnej nazwie obrazu w następujący sposób:docker rmi -f $(docker images --format '{{.Repository}}:{{.Tag}}' --filter=reference='imagename:*')'
timmins
1
w docker rmi $( docker images --format '{{.Repository}}:{{.Tag}}' | Select-String -Pattern 'imagename')
systemie
20

docker imagesw rzeczywistości używa pierwszego argumentu pozycyjnego jako nazwy obrazu do filtrowania. Nie są wymagane żadne grep i awk. Ta -qopcja zwróci tylko zgodne identyfikatory obrazów, do których można przesłać docker rmi.

docker rmi --force $(docker images -q 'imagename' | uniq)

uniqJest zobowiązany do usuwania duplikatów, w przypadku, gdy mają ten sam obraz oznaczone inaczej.

udondan
źródło
To z pewnością najlepsza opcja dzisiaj. Aby zachować spójność pytania, chociaż nazwa obrazu powinna być w cudzysłowie.
Colm Bhandal
8

Po prostu możesz dodać --forcena końcu polecenia. Lubić:

sudo docker rmi <docker_image_id> --force

Aby uczynić go bardziej inteligentnym , możesz zatrzymać dowolny działający kontener przed usunięciem obrazu:

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

W docker ps, $ 1 to pierwsza kolumna, tj. Identyfikator kontenera dockera, a $ 3 to trzecia kolumna, tj. Identyfikator obrazu dockera

kushalbhattad
źródło
5

Uważam, że moja odpowiedź jest prostsza.

Na przykład nazwa twojego obrazu to python_image.

Twój kod powinien wyglądać następująco :

docker rmi $(docker images --filter=reference='python_image' --format "{{.ID}}")

Mam nadzieję, że to pomoże.

Reamon C. Sumapig
źródło
Czy możemy to zrobić dla wielu obrazów na podstawie nazwy wieloznacznej?
zmienna
3

Otrzymałem też inną zwięzłą odpowiedź. Jedyną zmianą było usunięcie niepotrzebnej -I {}flagi.

docker images | grep 'imagename' | xargs docker rmi

Aditya Singh
źródło
3
docker rmi `docker images | awk '$1 ~ /imageName/ {print $3}'`

Spowoduje to usunięcie wszystkich obrazów o nazwie „nazwa_obrazu”. W niektórych przypadkach może to spowodować błąd typu „odwołanie do obrazu znajduje się w jednym lub kilku repozytoriach”. W takim przypadku użyj wymuszenia usunięcia.

docker rmi -f `docker images | awk '$1 ~ /imageName/ {print $3}'`

Innym sposobem może być:

docker images | awk '{ OFS = ":" }$1 ~ /imageName/ {print $1,$2}'
zaman sakib
źródło
3

Z jakiegoś powodu nie mogłem skorzystać z żadnej z podanych tutaj odpowiedzi. Oto, co zadziałało dla mnie.

docker images | grep \"gcr.io/kubernetes-learn-197422/last-week-weather-service\" | awk '{print $3}' | xargs docker rmi

awk '{print $3}'jest ważną częścią. Wydobywa identyfikator z trzeciej kolumny.

sergeyz
źródło
3

U mnie działało ( wersja Dockera 19.03.5 ):

docker rmi $(docker images 'imagename' -q)

Polecenie " docker images 'nazwaobrazu' -q " wyświetli wszystkie identyfikatory obrazów z pojedynczego cudzysłowu, więc połączenie go z docker rmi (lub docker rmi -f do wymuszenia) usunie wszystkie obrazy o wybranej nazwie

Giuse Petroso
źródło
1
docker rmi $(docker image ls repo/image_name* | awk {'print $1":"$2'} )
Michael A.
źródło
0

Drobna uwaga: z naszych doświadczeń wynika, że ​​od wersji docker 18.03 nie możesz już usuwać nieoznakowanych obrazów na podstawie samej nazwy. Musisz użyć nazwy + tagu, jak podano powyżej, lub użyć identyfikatora.

docker images --format={{.ID}} | xargs -I % sh -c 'docker rmi --force % 2>&1'
Tim Chaubet
źródło
0

docker rmi $(docker images --filter=reference="IMAGENAME:TAG")

na przykład, jeśli mam następujące obrazy

REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
abcdefg/hij                   7.0.0-beta-4.0      3128835950cd        7 days ago          51.4MB
abcdefg/hij-action            7.0.0-beta-4.0      42a7255beb74        7 days ago          97.4MB
abcdefg/hij-test              7.0.0-beta-4.0      17246aed35d0        7 days ago          97.4MB
abcdefg/hij-server            7.0.0-beta-4.0      42c45e561f2c        7 days ago          335MB
abcdefg/hij-init              7.0.0-beta-3.0      f648bb622933        7 days ago          55.2MB
abcdefg/hij-dir               7.0.0-beta-3.0      0db07d3aaccf        7 days ago          97.4MB
abcdefg/hij-mount             7.0.0-beta-3.0      18d1c0e1502c        4 weeks ago         33.7MB

Następnie docker rmi $(docker images --filter=reference="abcd*:*4.0")usunie pierwsze cztery obrazy.

Więcej informacji można znaleźć pod adresem https://docs.docker.com/engine/reference/commandline/images/

HarryQ
źródło
działa, ale lepiej byłoby dodać '-q' do polecenia docker rmi $(docker images -q --filter=reference="IMAGENAME:TAG")
docker
0

Przygotuj rozwiązanie tego pytania odpowiadające moim potrzebom, które nie zostało wcześniej opublikowane.

Chciałem, aby dopasować lokalnie zbudowane wizerunki: library/myappże mam przemianowany, oznaczone i pchnął do prywatnej repo: myrepo.org/library/myapp. Po ich wypchnięciu chcę wyczyścić lokalny reg.

I nie obchodzi mnie, czy nic nie zostanie znalezione lub polecenie wyrzuca błąd. W ten sposób dodane || truena końcu do włączenia do skryptów.

docker rmi $(docker image ls */library/myApp --format '{{.Repository}}:{{.Tag}}') || true
Jan
źródło
0

Opierając się na odpowiedzi @ Aditya, możesz również utworzyć funkcję bash, aby łatwo usunąć obrazy. Umieść tę funkcję w swoim ~/.profile. Utwórz nową sesję powłoki lub zbierz ją za pomocą source ~/.profile.

function drmi() {
    docker images | grep $1 |  xargs docker rmi
}

Stosowanie:

drmi golang
Halil Kaskavalci
źródło
0

Informacyjne:

docker rmi $(docker images --format "{{.Repository}}:{{.Tag}}" |grep imagename |grep none)

Podaj ten błąd:

Odpowiedź na błąd od demona: nieprawidłowy format odniesienia

Prawdopodobnie dlatego, że moje obrazy wyglądają tak:

hostname:5000/imagename:<none>

Musiałem użyć identyfikatora obrazu i wykonać to polecenie:

docker rmi `docker images --format "{{.Repository}}:{{.Tag}} {{.ID}}" |grep imagename |grep none |cut -d ' ' -f2`

Aby usunąć opuszczone pojemniki:

docker container rm `docker container ls -a --format "{{.ID}} {{.Image}} {{.Status}}" |grep Exited |grep imagename|cut -d ' ' -f1`
Martin P.
źródło