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


265

У мене є такі зображення:

alex@alexvps:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
<none>              <none>              70c0e19168cf        5 days ago          1.069 GB
<none>              <none>              c2ce80b62174        8 days ago          399.2 MB
<none>              <none>              60afe4036d97        8 days ago          325.1 MB

і коли я намагаюся видалити одну з них, я отримую:

alex@alexvps:~$ sudo docker rmi 60afe4036d97
Error: Conflict, 60afe4036d97 wasn't deleted
2014/01/28 00:54:00 Error: failed to remove one or more images

Як їх видалити? Чому виникає такий конфлікт?

Відповіді:


478

Для того, щоб видалити всі зображення, використовуйте задану команду

docker rmi $(docker images -q)

Для того, щоб видалити всі контейнери, використовуйте дану команду

docker rm $(docker ps -a -q)

Попередження: Це знищить усі ваші зображення та контейнери. Відновити їх неможливо!

Це рішення надає Techoverflow.net .


17
Простий і прямий. Також ви нижче команди, щоб змусити видаляти зображення. 'docker rmi -f $ (docker images -q)'
dimuthu

37
Еквівалент windows powerhelldocker images -q | %{docker rmi -f $_}
BeatingToADifferentRobot

1
Спочатку я використав cmd на @muheed Як відповісти ( stackoverflow.com/a/30475249/2747020 ), щоб розблокувати видалення деяких зображень:sudo docker ps -a -q | xargs -n 1 -I {} sudo docker rm {}
Razec Luar

1
Windows Powershell для докерних контейнерівdocker ps -a -q | %{docker rm -f $_}
Dexter

1
Як зазначає @ alexyz78 нижче, тепер ви можете користуватися docker system prune. Отже, щоб витерти що завгодно: docker kill $(docker ps -q)зупинити контейнери з подальшим а docker system prune -aбуде видалити все - див. Stackoverflow.com/a/44309011/247708
Бхарат

101

Можлива причина: Причина може полягати в тому, що це зображення зараз використовується запущеним контейнером. У такому випадку ви можете перерахувати запущені контейнери, зупинити відповідний контейнер і потім видалити зображення:

docker ps
docker stop <containerid>
docker rm <containerid>
docker rmi <imageid>

Якщо ви не можете знайти контейнер за допомогою docker ps, ви можете скористатися цим, щоб перелічити всі вже вийшли контейнери та видалити їх.

docker ps -a | grep 60afe4036d97
docker rm <containerid>

Примітка. Будьте обережні, щоб видалити всі контейнери, що вийшли, відразу, якщо ви використовуєте Volume-Onlyконтейнери. Вони залишаються в Exitштаті, але містять корисні дані .


Насправді, ви отримаєте повідомлення із зазначенням цього. Можливо, інше зображення базується на цьому? Спробуйте спочатку видалити будь-які створені вами зображення з цього зображення.
qkrijger

12
Я зміг видалити зображення за допомогою sudo docker ps -a | grep Exit | awk '{print $1}' | sudo xargs docker rm(завдяки github.com/dotcloud/docker/isissue/3258 ), а потім за допомогоюsudo docker rmi 70c0e19168cf
alexyz78

2
Будьте обережні, видаляючи зображення у Exitстані. Якщо ви використовуєте контейнери лише для обсягу даних, вони не працюють.
aceofspades

1
awk can grep:awk '/Exit/ {print $1}'
Дуайт Спенсер

Ваші команди кидають це Error response from daemon: No such container: .... Важко сказати, що треба замінити, і чим я повинен замінити. Не використовуйте...
Felo Vilches

60

Причина помилки полягає в тому, що, хоча на зображенні не було тегів, все ще існує контейнер, створений для цього зображення, який може знаходитися в exitedстані. Тому вам потрібно переконатися, що ви зупинили та видалили всі контейнери, створені на цих зображеннях. Наступна команда допоможе вам видалити всі контейнери, які не запущені:

docker rm `docker ps -aq --no-trunc --filter "status=exited"`

Тепер це видаляє всі звисаючі непроміжні <none>зображення:

docker rmi `docker images --filter 'dangling=true' -q --no-trunc`

Примітка. Щоб зупинити всі запущені контейнери:

docker stop `docker ps -q`

1
Дякую за це, я вважав, що це найчистіша реалізація.
Джозеф Сойєр

7
Будьте уважні, якщо у вас є контейнери для обсягу даних, оскільки вони "статус = вийшли". Це означає, що ви втратите всі свої дані.
Йохан

19

Наразі зображення може використовуватися запущеним контейнером, тому спочатку потрібно зупинитися та вийняти контейнер (и).

docker stop <container-name>
docker rm <container-id>

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

docker rmi <image-id>

Ви повинні бути впевнені, що це зображення не залежить від інших зображень (інакше спочатку їх потрібно видалити).

У мене був дивний випадок, коли в мене більше немає живих контейнерів ( docker ps -aнічого не поверталося), але я не зміг видалити зображення та його залежність від зображення.

Щоб вирішити ці особливі випадки, ви можете змусити видалити зображення за допомогою цього:

docker rmi -f <image-id>

19

На Bash:

for i in `sudo docker images|grep \<none\>|awk '{print $3}'`;do sudo docker rmi $i;done

Це видалить усі зображення з назвою "<none>". Я вважав ці зображення зайвими.


3
Це не відповідає на питання, але все-таки дуже корисно. Дякую.
binwiederhier

5
зробіть цю команду простою docker images|grep \<none\>|awk '{print $3}' | xargs docker rmi, вона може потребувати sudoдозволу
Ларрі Кай

15

Я знайшов відповідь у цій команді:

docker images --no-trunc | grep none | awk '{print $3}' | xargs docker rmi

У мене виникла проблема, коли я видалив деякі використовувані зображення, і не зрозумів (використовуючи docker ps -a).


9

Оскільки Докер вер. 1.13.0 (січень 2017) є system pruneкоманда:

$ docker system prune --help

Usage:  docker system prune [OPTIONS]

Remove unused data

Options:
-a, --all     Remove all unused images not just dangling ones
-f, --force   Do not prompt for confirmation
    --help    Print usage

7

Окрім відповіді Соні:

Щоб видалити всі зображення на машині Windows (за допомогою Docker для Windows) у вікні PowerShell, виконайте такі дії:

docker images -q | %{docker rmi -f $_}

Щоб видалити всі контейнери на машині Windows (з Docker для Windows) у вікні PowerShell, виконайте такі дії:

docker ps -a -q | %{docker rm -f $_}

6

Спочатку видаліть усі контейнери за допомогою наступної команди

sudo docker ps -a -q | xargs -n 1 -I {} sudo docker rm {}

Потім видаліть зображення за його ідентифікатором за допомогою наступної команди

sudo docker rmi <image-id>

Варто зазначити, якщо для деяких людей це не очевидно, що це видалить усі запущені контейнери Docker.
Майкл Міор


4

Вийміть усі контейнери

docker ps -q -a | xargs docker rm

Примушуйте видалити всі зображення Docker

docker rmi -f $(docker images -f dangling=true -q)

4

Просто ви можете додати --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 - перший стовпець, тобто ідентифікатор контейнера Docker.

І docker images$ 3 - це третій стовпець, тобто ідентифікатор зображення Docker.


3

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

docker rmi $(docker images | grep "^<none>" | awk '{print $"3"}')

3

Щоб видалити деяке зображення Docker, потрібно виконати таку команду:

$ docker rmi <docker_image_id>

Отже, для видалення всіх зображень Docker можна виконати таку команду:

$ docker rmi $(docker images -q)

Тепер, якщо ви хочете видалити всі зображення Docker (включаючи зображення, які використовуються), ви можете додати прапор -f, наприклад:

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

3

Використовуйте

docker image prune -all

або

docker image prune -a

Видаліть усі звисаючі зображення. Якщо -aвказано, воно також видалить усі зображення, на які не посилається жоден контейнер.

Примітка: Вам буде запропоновано підтвердити, перш ніж чорнослив нічого не видалить, але вам не буде показано перелік того, що потенційно буде видалено. Крім того, docker image lsне підтримує негативну фільтрацію, тому важко передбачити, які зображення насправді будуть видалені.

Як зазначено в документації Докера на чорнослив .


1

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


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