Як видалити зображення докера на основі імені?


94

Я хочу видалити всі версії зображень докера з іменами, що містять заданий рядок ( 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

@michali Це означає, що не повертається відповідне зображення. Чи можете ви переконатися, що присутній відповідний запис, просто запустивши:docker images |grep 'imagename'
Rambler

73

Трохи точніша версія - grepping лише на ім'я сховища:

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

25
це лише видаляє зображення, позначені найновішимиdocker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
Дрю

Дякую! Це те, що я шукав.
Хардхік,

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

1
Чи можете ви пояснити, що це робить? Біти випадкового коду можуть бути небезпечними.
кілоджоулі

6
docker images --format '{{.Repository}}:{{.Tag}}фільтрує вихідні дані, так що відображаються лише repo & 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 є першою колонці тобто докер контейнер ID і $ 3 є третій колонці тобто докер ідентифікатор зображення


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 для примусу), вона видалить всі зображення з вибраним ім'ям



0

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

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/


працює, але було б краще додати '-q' до команди docker rmi $(docker images -q --filter=reference="IMAGENAME:TAG")
docker

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`
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.