Я хочу удалить все версии образов докеров с именами, содержащими заданную строку ( imagename
).
Я пробовал следующее, но похоже, что это не работает:
docker images | grep 'imagename' | xargs -I {} docker rmi
Я хочу удалить все версии образов докеров с именами, содержащими заданную строку ( imagename
).
Я пробовал следующее, но похоже, что это не работает:
docker images | grep 'imagename' | xargs -I {} docker rmi
Ответы:
Попробуйте следующее:
docker rmi $(docker images |grep 'imagename')
Windows Powershell:
docker rmi $(docker images --format "{{.Repository}}:{{.Tag}}"|findstr "imagename")
docker images |grep 'imagename'
Чуть более точная версия - поиск только по имени репозитория:
docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
docker images --format '{{.Repository}}:{{.Tag}}
фильтрует вывод, поэтому отображаются только репо и тег (т.е. foo:latest
). grep 'imagename
фильтрует эти строки только теми изображениями, которые содержат imagename
. Ввод этого $()
оценивает это и переходит к внешнему, docker rmi
который удаляет те изображения, которые были сопоставлены.
docker rmi -f $(docker images --format '{{.Repository}}:{{.Tag}}' --filter=reference='imagename:*')'
docker rmi $( docker images --format '{{.Repository}}:{{.Tag}}' | Select-String -Pattern 'imagename')
docker images
фактически использует первый позиционный аргумент как имя изображения для фильтрации. Никаких grep и awk не требуется. -q
Вариант будет возвращать только идентификаторы подходящих изображений , которые могут быть поданы в docker rmi
.
docker rmi --force $(docker images -q 'imagename' | uniq)
Это uniq
необходимо для удаления дубликатов, если одно и то же изображение помечено по-разному.
Просто можно добавить --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-й столбец, т.е. идентификатор образа докера.
Я считаю свой ответ более простым.
Например, имя вашего изображения python_image
.
Тогда ваш код должен быть :
docker rmi $(docker images --filter=reference='python_image' --format "{{.ID}}")
Надеюсь, это поможет.
Я также получил еще один краткий ответ. Единственное изменение - убрать ненужный -I {}
флаг.
docker images | grep 'imagename' | xargs docker rmi
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}'
По какой-то причине я не смог использовать здесь ни один из приведенных ответов. Вот что у меня сработало.
docker images | grep \"gcr.io/kubernetes-learn-197422/last-week-weather-service\" | awk '{print $3}' | xargs docker rmi
awk '{print $3}'
это важная часть. Он извлекает идентификатор из 3-го столбца.
У меня сработало ( версия Docker 19.03.5 ):
docker rmi $(docker images 'imagename' -q)
Команда « docker images 'imagename' -q » перечислит все идентификаторы изображений для одного аргумента в кавычках, поэтому, объединив его с docker rmi (или docker rmi -f для принудительного), он удалит все изображения с выбранным именем
Незначительное замечание: из того, что мы переживаем, кажется, что вы - начиная с docker 18.03 - больше не можете удалять немаркированные изображения на основе только имени. Вам нужно либо использовать тег name +, как указано выше, либо использовать идентификатор.
docker images --format={{.ID}} | xargs -I % sh -c 'docker rmi --force % 2>&1'
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/.
docker rmi $(docker images -q --filter=reference="IMAGENAME:TAG")
Составьте для меня решение этого вопроса, которое ранее не публиковалось.
Я хотел , чтобы соответствовать локально встроенным изображениям: library/myapp
что я переименовал, помеченный, и подтолкнул к частному репо: myrepo.org/library/myapp
. Как только они будут отправлены, я хочу очистить локальную регистрацию докеров.
И мне все равно, если ничего не найдено или команда выдает ошибку. Таким образом добавляется || true
в конце для включения в скрипты.
docker rmi $(docker image ls */library/myApp --format '{{.Repository}}:{{.Tag}}') || true
Основываясь на ответе @ Aditya, вы также можете создать функцию bash, чтобы легко удалять изображения. Поместите эту функцию в свой ~/.profile
. Создайте новый сеанс оболочки или создайте его с помощью source ~/.profile
.
function drmi() {
docker images | grep $1 | xargs docker rmi
}
Применение:
drmi golang
Информационная:
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`