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


839

Я запускаю Docker під Vagrant в ОС X 10.8.4 (Mountain Lion), і коли я намагаюся видалити збережене зображення, я отримую помилку:

$ docker rmi some-image-id
2013/07/15 hh:mm:ss unexpected JSON input

Згідно з rmiдовідкою, правильний синтаксис є docker rmi IMAGE [IMAGE...], і я не впевнений, що з цього зробити.

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

$ docker version
Client version: 0.4.8
Server version: 0.4.8
Go version: go1.1

 

$docker info
Containers: 1
Images: 3

Цікаво, що коли я бігаю docker ps, жоден контейнер не з’являється. Біг docker imagesпоказує чотири (4) baseзображення та одне (1) nodeзображення.


1
Яку версію докера ви використовуєте? Чи можете ви вставити висновки "докерна версія" та "інформація про докер"? Я просто спробував з майстром і це спрацювало чудово.
скрип

Я оновив питання з цією інформацією.
Жюль

1
docker infoпоказує фактичну кількість зображень, ви можете спробувати, ./docker images -a -q | sort | uniq | wc -lце повинен бути однаковий результат (-a для всіх зображень, -q лише для ідентифікаторів). docker psпоказує лише активні контейнери, ви можете зробити docker ps -aсписок усіх контейнерів
скрип

Чи можете ви спробувати запустити докер-демон з -Dопцією та клієнтом? docker -d -D& ; docker -D rmi <id>. Ви також можете спробувати CID=$(docker run -d ubuntu bash); ID=$(docker commit $CID); docker rmi $ID?
скрип

4
Подивіться на цей запит на тягу: github.com/dotcloud/docker/pull/1225
скрип

Відповіді:


1012

Спробуйте docker rmi node. Це має спрацювати.

Побачити всі створені контейнери так само просто docker ps -a.

Щоб видалити всі існуючі контейнери (не зображення!), Запустіть docker rm $(docker ps -aq)


13
Якщо деякі ваші контейнери все ще запущені, ви можете запустити: docker stop $ (docker ps -qa), щоб зупинити всі контейнери. Я думаю, що видалити запущений контейнер може не спрацювати, принаймні я пам’ятаю, що у мене були проблеми з цим. Я можу помилитися з нею ... Я перевірив сторінку man, і вона підтримує мою гіпотезу: "-f, --force = true | false видалення примусового запуску контейнера. За замовчуванням - false".
Конрад Кляйн

1
Ах, я не знав про команду "видалити весь існуючий контейнер". Писав власний: docker ps -a | sed -r 's / ^ (\ w +). * / \ 1 / g' | sed -r 's / ^ КОНТЕЙНЕР //' | sed -r 's / ^ (\ w +) / docker rm \ 1 / g' | awk 'система ($ 0)' Дякую!
Анураг

4
Ви знаєте, що параметри командного рядка погано розроблені, коли вам потрібно використовувати спеціальні функції оболонки для досягнення основних функціональних можливостей.
користувач3467349

Щоб видалити всі існуючі зображення, ви можете використовувати - "docker rmi $ (docker images -q)"
людина

Для видалення всіх існуючих контейнерів за допомогою Windows powerhell: docker ps -aq | Foreach-Object { docker stop $_; docker rm $_; }
fartwhif

565

Нижче наведено кілька способів видалення зображень / контейнерів докера:

Видаліть одне зображення

docker rmi image_name:version/image-id

Видаліть усі зображення

docker rmi $(docker images -qf "dangling=true")

Вбийте контейнери та вийміть їх:

docker rm $(docker kill $(docker ps -aq))

Примітка: Замінити killз stopдля поступового виключення

Видаліть усі зображення, крім "my-image"

Використовуйте grep для видалення всіх, крім my-imageіubuntu

docker rmi $(docker images | grep -v 'ubuntu\|my-image' | awk {'print $3'})

Або (без лиха)

docker rmi $(docker images --quiet | grep -v $(docker images --quiet ubuntu:my-image))


25
Додавання: видаліть "звисаючі" зображення (зображення без тегів):docker rmi $(docker images -qf "dangling=true")
kolypto

5
повинен бутиdocker rm $(docker kill $(docker ps -a -q))
BMW

1
"Видалити всіх, окрім" без docker rmi $(docker images --quiet | grep -v $(docker images --quiet ubuntu:my-image))
неприємності

1
@kolypto Схоже, що "dangling = true" не видаляє контейнери, що не звисають. Виконайте знову, мінус -f та звисаючий прапор, щоб видалити решту.
DougW

1
Це тільки я, або ця остання пропозиція (або (без урод)) насправді не працює?
Майк Мудрий

196

Видаліть усі контейнери докера

docker rm $(docker ps -a -q)

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

docker rmi $(docker images -q)

7
Видалити непомічені зображення:docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
Barrett Clark,

1
eq8.eu/blogs/23-spring-cleaning-for-webdevelopers, sudo docker rmi -f $(sudo docker images | grep "<none>" | awk "{print \$3}") а потім видалити теги релізів 2015 року (наприклад live-20150121223), що ми можемо зробити sudo docker rmi -f $(sudo docker images | grep live-2015 | awk "{print \$3}")
еквівалентно8

Щоб змусити це, потрібно написати: docker -f rm $ (docker ps -a -q)
Адріан Лопес

71

Щоб видалити зображення з Docker, використовуючи ідентифікатор зображення:

  1. Отримайте список усіх зображень

    docker images
    
  2. Визначте ідентифікатор зображення, яке ви хочете видалити, наприклад:

    REPOSITORY     TAG     IMAGE ID        CREATED        VIRTUAL SIZE
    kweku360/java  latest  08d3a9b8e166    2 weeks ago         5.733 GB`
    
  3. Нарешті видаліть зображення за допомогою ідентифікатора зображення (потрібні лише перші три цифри)

    docker rmi 08d
    

1
По- перше одна необхідність зупинки контейнера і видалити його, зверніться до stackoverflow.com/questions/21398087 / ...
vikramvi

37

Зображення:

  1. Список зображень

    зображення докера

  2. Видаліть одне зображення

    docker rmi image_name

  3. Примушуйте видалити одне зображення

    docker rmi -f image_name

Контейнер:

  1. Список усіх контейнерів

    докер пс -а

  2. Вийміть один контейнер

    docker rm container_id

  3. Примушуйте вийняти один контейнер

    docker rm -f container_id


29

Оновлення, як коментує VonC у розділі Як видалити старі контейнери Docker .

З Docker 1.13 (Q4 2016) у вас є:

docker system prune видалить ВСІ невикористані дані (тобто для того, щоб контейнери зупинені, томи без контейнерів та зображення без контейнерів).

Дивіться PR 26108 і введіть 86de7c0 , які вводять кілька нових команд, щоб полегшити візуалізацію, скільки місця займають дані демона Docker на диску і дозволяють легко очистити "зайві" надлишки.

docker system prune

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y

Дякую за грунтовну відповідь, але це не відповідає безпосередньо на оригінальне запитання (на яке вже відповіли, і головна відповідь як і раніше актуальна).
Жуль

2
Я згоден. Однак, оскільки назва цього питання є дуже загальною, це стало на зразок референтного питання, тому я подумав, що оновлення механізму було в наявності.
qkrijger

24

Видалення контейнерів

  1. Для видалення конкретного контейнера

    docker rm CONTAINER_ID CONTAINER_ID
    
    • Для одного зображення

      docker rm  70c0e19168cf
      
    • Для декількох зображень

      docker rm  70c0e19168cf c2ce80b62174
      
  2. Вийміть контейнери, що вийшли

    docker ps -a -f status=exited
    
  3. Вийміть усі контейнери

    docker ps -q -a | xargs docker rm
    


Видалення зображень

docker rmi IMAGE_ID
  1. Видаліть конкретні зображення

    • для одного зображення

      docker rmi ubuntu
      
    • для декількох зображень

      docker rmi ubuntu alpine
      
  2. Видалення звисаючих зображень
    Висячі зображення - це шари, які не мають відношення до жодних позначених зображень, оскільки зображення Докера складаються з декількох зображень.

    docker rmi -f $(docker images -f dangling=true -q)
    
  3. Видаліть усі зображення Docker

    docker rmi -f $(docker images -a -q)
    

Видалення обсягів

Щоб перерахувати томи, запустіть docker volume ls

  1. Видаліть певний об'єм

    docker volume rm VOLUME_NAME
    
  2. Видаліть звисаючі обсяги

    docker volume rm $(docker volume ls -f dangling=true -q)
    
  3. Вийміть контейнер і його обсяги

    docker rm -v CONTAINER_NAME
    

Чому подвійний CONTAINER_ID?
Пітер Мортенсен

19

docker rm container_name

docker rmi image_name

docker help

rm Вийміть один або кілька контейнерів

rmi Видаліть одне або більше зображень


Дякую, але на це питання вже є кілька відповідей, і обрана відповідь, яка вирішила проблему майже 3 роки тому.
Жуль

13
docker rmi  91c95931e552

Відповідь на помилку від демона: конфлікт, не можна видалити 91c95931e552, оскільки контейнер 76068d66b290 використовує його, використовуйте -f для примусового використання FATA [0000] Помилка: не вдалося видалити одне або більше зображень

Знайти ідентифікатор контейнера,

# docker ps -a

# docker rm  daf644660736 

Це відповідь на запитання?
Пітер Мортенсен

Чому daf644660736? Як це пов'язано з будь-яким із попередніх?
Пітер Мортенсен

5

Перш за все, ми повинні зупинити та вийняти контейнери Docker, які додаються із зображенням Docker, яке ми збираємось видалити.

Тож для цього спочатку

  • docker stop container-id - Для зупинки запущеного контейнера
  • docker rm container-id - Для видалення / вилучення контейнера

тоді,

  • docker rmi image-id - Щоб видалити / видалити зображення

3

Для версій 1.13 і новіших:

docker image rm [OPTIONS] IMAGE [IMAGE...]

Порівняння:

[OPTIONS], Здається , немає ніякої різниці.

--force , -f        Force removal of the image
--no-prune          Do not delete untagged parents

Від: Представлення Докер 1.13

КЛІ реструктуризовано

У Docker 1.13 ми перегрупували кожну команду, щоб сидіти під логічним об'єктом, з яким вона взаємодіє. Так , наприклад , listі startконтейнери тепер підкоманду docker containerі historyє субкоманди docker image.

Ці зміни дозволяють нам очистити синтаксис Docker CLI, покращити текст довідки та зробити Docker простішим у використанні. Старий синтаксис команд все ще підтримується, але ми закликаємо всіх прийняти новий синтаксис .


3

Docker надає певну команду для видалення images.

Показати / видалити Images:

docker images
docker images -a # All images
docker images --no-trunc # List the full length image IDs

docker images --filter "dangling=true" // Show unstage images
docker rmi $(docker images -f "dangling=true" -q) # Remove on unstages images

docker rmi <REPOSITORY> or <Image ID> # Remove a single image

docker image prune # Interactively remove dangling images
docker image prune -a # Remove all images

or 

docker rmi -f $(sudo docker images -a -q)

Також ви можете також використовувати filterпараметри для видалення набору зображень відразу:

Приклад:

$docker images --filter "before=<hello-world>" // It will all images before hello-world

$docker images --filter "since=<hello-world>" // It will all images since hello-world

Таким чином, ви можете видалити такі фільтруючі зображення:

docker rmi $(docker images --filter "since=<hello-world>")
docker rmi $(docker images --filter "before=<hello-world>")

1

Видаліть усі за допомогою

Крок 1: Вбийте всі контейнери

for i in `sudo docker ps -a | awk '{ print $1 }'`; do sudo docker kill $i ; done

Крок 2: Спершу відправте їх

for i in `sudo docker ps -a | awk '{ print $1 }'`; do sudo docker rm $i ; done

Крок 3: Видаліть зображення за допомогою сили

for i in `sudo docker images | awk '{ print $3}'`; do  sudo docker rmi --force $i ; done

Використовуйте крок 1 у випадку, якщо ви отримуєте помилку, кажучи, що її неможливо видалити через залежність дитини


1

Якщо ви хочете автоматично / періодично очищати закриті контейнери та видаляти зображення та томи, які не використовуються запущеним контейнером, ви можете завантажити зображення meltwater/docker-cleanup.

Я використовую це на виробництві, оскільки ми розгортаємо кілька разів на день на декількох серверах, і я не хочу ходити на кожен сервер, щоб очистити (це буде біль).

Просто запустіть:

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

Він запускається кожні 30 хвилин (або скільки завгодно часу ви встановите його за допомогою опції DELAY_TIME = 1800) та очищатиме виїзні контейнери та зображення.

Детальніше: https://github.com/meltwater/docker-cleanup/blob/master/README.md


1

Ось сценарій оболонки для видалення тегованого (названого) зображення та його контейнерів. Збережіть як docker-rmi та запустіть за допомогою "docker-rmi my-image-name"

#!/bin/bash

IMAGE=$1

if [ "$IMAGE" == "" ] ; then
  echo "Missing image argument"
  exit 2
fi

docker ps -qa -f "ancestor=$IMAGE" | xargs docker rm
docker rmi $IMAGE

вам потрібно xargs -rзмусити його працювати у невідповідному випадку контейнера.
як.

0

Чому ніхто не згадав docker-compose! Я просто вживаю його один тиждень, і не можу вижити без нього. Все, що вам потрібно, це написати yml, який займає лише кілька хвилин вивчення, і тоді ви готові піти. Він може завантажувати зображення, контейнери (які потрібні в так званих сервісах) і дозволяє переглядати журнали так само, як ви використовуєте з нативними командами docker. Спробуйте:

docker-compose up -d
docker-compose down --rmi 'local'

Перш ніж я використовував docker-compose, я написав власний скрипт оболонки, тоді мені довелося налаштовувати сценарій, коли це потрібно, особливо коли змінювалася архітектура додатків. Тепер мені більше не потрібно цього робити, завдяки docker-compose.


docker-composeє інструментом оркестрації і часто недоцільний для використання в простих проектах. Автономне dockerрішення (не вимагає використання часто-finnicky конфігурацій docker-compose.yml) є кращим у контексті цього питання. Крім того, тут вже є багато- багато хороших відповідей.
Жуль

@Jules ніхто не згадував docker-compose не означає, що вони є поганими відповідями, і це не означає, що це також безпорадний відповідь. Рідні команди Docker непогані, але виснажливі, і для цього потрібно щоразу вводити багато. "Одне добре, а два - занадто багато".
Тіна

-1

Для мене добре працювали наступні:

> docker images
REPOSITORY   TAG           IMAGE ID          CREATED             SIZE
debian       jessie        86baf4e8cde9      3 weeks ago         123MB
ubuntu       yakkety       7d3f705d307c      3 weeks ago         107MB
alpine       3.5           074d602a59d7      7 weeks ago         3.99MB

Потім вийдіть і видаліть зображення, виконавши такі:

> docker rmi debian:jessie
> docker rmi ubuntu:yakkety
> docker rmi alipine:3.5

-1

Список зображень:

ahanjura@ubuntu:~$ sudo docker images

СКЛАД TAG IMAGE ID СТВОРЕНО РОЗМІР 88282f8eda00 19 секунд тому 308,5 MB 13e5d3d682f4 19 годин назад 663 MB busybox2 останнім 05fe66bb1144 20 годин назад 1,129 MB Убунту 16,04 00fd29ccc6f1 5 днів тому 110,5 MB Убунту 14,04 67759a80360c 5 днів тому 221,4 MB пітон 2.7 9e92c8430ba0 7 днів назад 680,7 MB busybox останній 6ad733544a63 6 тижнів тому 1.129 MB ubuntu 16.10 7d3f705d307c 5 місяців тому 106.7 MB

Видалити зображення:

ahanjura@ubuntu:~$ sudo docker rmi 88282f8eda00

Вилучено: sha256: 88282f8eda0036f85b5652c44d158308c6f86895ef1345dfa788318e6ba31194 Виключено: sha256: 4f211a991fb392cd794bc9ad8833149cd9400c5955958c4017b1e2dc415e25e9 Виключено: sha256: 8cc6917ac7f0dcb74969ae7958fe80b4a4ea7b3223fc888dfe1aef42f43df6f8 Виключено: sha256: b74a8932cff5e61c3fd2cc39de3c0989bdfd5c2e5f72b8f99f2807595f8ece43

ahanjura@ubuntu:~$ sudo docker rmi 13e5d3d682f4

Відповідь на помилку від демона: конфлікт: не вдається видалити 13e5d3d682f4 (потрібно примусово) - зображення використовується зупиненим контейнером 5593e25eb638

Видалити насильно:

ahanjura@ubuntu:~$ sudo docker rmi -f 13e5d3d682f4

Вилучено: sha256: 13e5d3d682f4de973780b35a3393c46eb314ef3db45d3ae83baf2dd9d702747e Виключено: sha256: 3ad9381c7041c03768ccd855ec86caa6bc0244223f10b0465c4898bdb21dc378 Виключено: sha256: 5ccb917bce7bc8d3748eccf677d7b60dd101ed3e7fd2aedebd521735276606af Виключено: sha256: 18356d19b91f0abcc04496729c9a4c49e695dbfe3f0bb1c595f30a7d4d264ebf


-1

У моєму випадку проблеми полягають у тому, що у мене буксирують зображення з однаковою назвою, а рішення - додати тег після імені або ідентифікатора

sudo docker rmi <NAME>:<TAG>

колишній:

sudo docker rmi php:7.0.4-fpm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.