Как я могу удалить изображения Докера?


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
Эквивалент docker images -q | %{docker rmi -f $_}
PowerShell для Windows

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

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

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/issues/3258 ), а затем сsudo docker rmi 70c0e19168cf
alexyz78

2
Будьте осторожны, удаляя изображения в Exitсостоянии. Если вы используете контейнеры только для тома данных, они не будут работать.
aceofspades

1
awk может 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

В Баш:

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

Так как Docker вер. 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


0

Я нашел решение с помощью скрипта Powershell, которое сделает это за меня.

Сценарий сначала останавливает все контейнеры, затем удаляет все контейнеры, а затем удаляет изображения, названные пользователем.

Смотрите здесь http://www.devcode4.com/article/powershell-remove-docker-containers-and-images

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.