Как удалить образы докеров по имени?

93

Я хочу удалить все версии образов докеров с именами, содержащими заданную строку ( imagename).
Я пробовал следующее, но похоже, что это не работает:

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

Адитья Сингх
источник

Ответы:

136

Попробуйте следующее:

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

Windows Powershell:

docker rmi $(docker images --format "{{.Repository}}:{{.Tag}}"|findstr "imagename")
Рамблер
источник
17
Текущая версия Docker поддерживает это (без grep): docker rmi $ (docker images 'imagename')
Чарли
Текущая версия Docker, похоже, поддерживает это - может, я что-то упускаю? - docker rmi 'imagename'
Чарли
10
@Charlie Я думаю, что большинство людей ищут способ сопоставить все изображения, которые соответствуют ' imagename ', а не одно изображение, названное точно 'imagename'.
RJFalconer
1
Я получаю следующую ошибку: «docker rmi требует как минимум 1 аргумент».
michali 09
@michali Это означает, что не было возвращено подходящее изображение. Можете ли вы проверить наличие подходящей записи, просто запустив:docker images |grep 'imagename'
Рамблер
71

Чуть более точная версия - поиск только по имени репозитория:

docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
Элтон Стоунман
источник
25
это удаляет только изображения, отмеченные как самые свежиеdocker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
Дрю
Спасибо! Это то, что я искал.
Hardhik
26
docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
один и только один
источник
1
Вы можете объяснить, что это значит? Биты случайного кода могут быть опасными.
килоджоули
6
docker images --format '{{.Repository}}:{{.Tag}}фильтрует вывод, поэтому отображаются только репо и тег (т.е. foo:latest). grep 'imagenameфильтрует эти строки только теми изображениями, которые содержат imagename. Ввод этого $()оценивает это и переходит к внешнему, docker rmiкоторый удаляет те изображения, которые были сопоставлены.
Адам Паркин
Расширяя вышесказанное, вы можете удалить все изображения с тегами, соответствующие точному имени изображения, следующим образом:docker rmi -f $(docker images --format '{{.Repository}}:{{.Tag}}' --filter=reference='imagename:*')'
timmins
1
в окнах "grep" не существует (cmd или powershell) Следующее может быть использовано на вдовахdocker rmi $( docker images --format '{{.Repository}}:{{.Tag}}' | Select-String -Pattern 'imagename')
Zameer Fouzan
20

docker imagesфактически использует первый позиционный аргумент как имя изображения для фильтрации. Никаких grep и awk не требуется. -qВариант будет возвращать только идентификаторы подходящих изображений , которые могут быть поданы в docker rmi.

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

Это uniqнеобходимо для удаления дубликатов, если одно и то же изображение помечено по-разному.

удондан
источник
Безусловно, это лучший вариант на сегодняшний день. Чтобы сохранить последовательность вопроса, имя изображения должно быть в кавычках.
Колм Бхандал,
8

Просто можно добавить --forceв конце команды. Подобно:

sudo docker rmi <docker_image_id> --force

Чтобы сделать его более интеллектуальным, вы можете остановить любой работающий контейнер перед удалением образа:

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

В docker ps, $ 1 - это 1-й столбец, т.е. идентификатор контейнера докеров, а $ 3 - это 3-й столбец, т.е. идентификатор образа докера.

Kushalbhattad
источник
5

Я считаю свой ответ более простым.

Например, имя вашего изображения python_image.

Тогда ваш код должен быть :

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

Надеюсь, это поможет.

Реамон С. Сумапиг
источник
Можем ли мы сделать это для нескольких изображений на основе имени подстановочного знака?
переменная
3

Я также получил еще один краткий ответ. Единственное изменение - убрать ненужный -I {}флаг.

docker images | grep 'imagename' | xargs docker rmi

Адитья Сингх
источник
3
docker rmi `docker images | awk '$1 ~ /imageName/ {print $3}'`

Это приведет к удалению всех изображений по имени imageName. В некоторых случаях это может привести к ошибке типа «изображение ссылается на один или несколько репозиториев». В этом случае используйте принудительное удаление.

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

Другой способ может быть:

docker images | awk '{ OFS = ":" }$1 ~ /imageName/ {print $1,$2}'
Заман Сакиб
источник
3

По какой-то причине я не смог использовать здесь ни один из приведенных ответов. Вот что у меня сработало.

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

awk '{print $3}'это важная часть. Он извлекает идентификатор из 3-го столбца.

сергейз
источник
3

У меня сработало ( версия Docker 19.03.5 ):

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

Команда « docker images 'imagename' -q » перечислит все идентификаторы изображений для одного аргумента в кавычках, поэтому, объединив его с docker rmi (или docker rmi -f для принудительного), он удалит все изображения с выбранным именем

Джузе Петросо
источник
1
docker rmi $(docker image ls repo/image_name* | awk {'print $1":"$2'} )
Майкл А.
источник
0

Незначительное замечание: из того, что мы переживаем, кажется, что вы - начиная с docker 18.03 - больше не можете удалять немаркированные изображения на основе только имени. Вам нужно либо использовать тег name +, как указано выше, либо использовать идентификатор.

docker images --format={{.ID}} | xargs -I % sh -c 'docker rmi --force % 2>&1'
Тим Шобе
источник
0

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

например, если у меня есть следующие изображения

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

Затем docker rmi $(docker images --filter=reference="abcd*:*4.0")будут удалены первые четыре изображения.

Дополнительную информацию см. На https://docs.docker.com/engine/reference/commandline/images/.

HarryQ
источник
работает, но было бы лучше добавить '-q' в команду docker images: docker rmi $(docker images -q --filter=reference="IMAGENAME:TAG")
troyfolger
0

Составьте для меня решение этого вопроса, которое ранее не публиковалось.

Я хотел , чтобы соответствовать локально встроенным изображениям: library/myappчто я переименовал, помеченный, и подтолкнул к частному репо: myrepo.org/library/myapp. Как только они будут отправлены, я хочу очистить локальную регистрацию докеров.

И мне все равно, если ничего не найдено или команда выдает ошибку. Таким образом добавляется || trueв конце для включения в скрипты.

docker rmi $(docker image ls */library/myApp --format '{{.Repository}}:{{.Tag}}') || true
Джон
источник
0

Основываясь на ответе @ Aditya, вы также можете создать функцию bash, чтобы легко удалять изображения. Поместите эту функцию в свой ~/.profile. Создайте новый сеанс оболочки или создайте его с помощью source ~/.profile.

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

Применение:

drmi golang
Халил Каскавальчи
источник
0

Информационная:

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

Выдайте эту ошибку:

Ответ от демона об ошибке: неверный формат ссылки

Наверное потому, что мои изображения выглядят так:

hostname:5000/imagename:<none>

Мне пришлось использовать идентификатор изображения и выполнить эту команду:

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

Чтобы удалить вышедшие контейнеры:

docker container rm `docker container ls -a --format "{{.ID}} {{.Image}} {{.Status}}" |grep Exited |grep imagename|cut -d ' ' -f1`
Мартин П.
источник