Как удалить изображение в Docker?

841

Я запускаю Docker под Vagrant под OS 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
Какую версию Docker вы используете? Можете ли вы вставить вывод 'docker version' и 'docker info'? Я только что попробовал с мастером, и он работал нормально.
13:30
Я обновил вопрос с этой информацией.
Жюль
1
docker infoпоказывает фактическое количество изображений, вы можете попробовать, ./docker images -a -q | sort | uniq | wc -lэто должно быть одинаковым результатом (-a для всех изображений, -q только для идентификаторов). docker psпоказывает только активные контейнеры, вы можете сделать, docker ps -aчтобы просмотреть все контейнеры
creack
Можете ли вы попробовать запустить Docker с -Dопцией и клиентом? docker -d -D& ; docker -D rmi <id>, Вы тоже можете попробовать CID=$(docker run -d ubuntu bash); ID=$(docker commit $CID); docker rmi $ID?
Creack
4
Посмотрите на этот запрос: github.com/dotcloud/docker/pull/1225
creack

Ответы:

1014

Попробуй docker rmi node. Это должно работать.

Просмотреть все созданные контейнеры так же просто, как docker ps -a.

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

Ник Стинамантес
источник
13
Если некоторые из ваших контейнеров все еще работают, вы можете запустить: docker stop $ (docker ps -qa), чтобы остановить все контейнеры. Я думаю, что удаление работающего контейнера может не сработать, по крайней мере, я помню, у меня были проблемы с этим. Возможно, я ошибаюсь ... Я проверил страницу руководства, и она поддерживает мою гипотезу: "-f, --force = true | false Принудительно удалить работающий контейнер. По умолчанию установлено значение false."
Конрад Кляйн
1
Ах, я не знал о команде "удалить все существующие контейнеры". Написал свой собственный: docker ps -a | sed -r 's / ^ (\ w +). * / \ 1 / g' | sed -r 's / ^ CONTAINER //' | sed -r 's / ^ (\ w +) / docker rm \ 1 / g' | awk 'system ($ 0)' Спасибо!
Анураг
4
Вы знаете, что параметры командной строки плохо спроектированы, когда вам нужно использовать специфичные для оболочки функции для достижения основных функций.
user3467349
Чтобы удалить все существующие изображения, вы можете использовать - "docker rmi $ (docker images -q)"
человек
Чтобы удалить все существующие контейнеры с помощью Windows docker ps -aq | Foreach-Object { docker stop $_; docker rm $_; }
PowerShell
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'})

Или (без awk)

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

Ulises
источник
25
Дополнение: удалите «висящие» изображения (изображения без тегов):docker rmi $(docker images -qf "dangling=true")
kolypto
5
должно бытьdocker rm $(docker kill $(docker ps -a -q))
BMW
1
«Удалить все, кроме» без awk:docker rmi $(docker images --quiet | grep -v $(docker images --quiet ubuntu:my-image))
Фоби
1
@kolypto Кажется, что "dangling = true" не удаляет не висящие контейнеры. Запустите снова, минус флаг -f и висящий флаг, чтобы удалить остальные.
Дугв
1
Это только я, или это последнее предложение (или (без awk)) действительно не работает?
Майк Мудрый
196

Удалить все контейнеры докеров

docker rm $(docker ps -a -q)

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

docker rmi $(docker images -q)
куколка
источник
7
Удалить непомеченные изображения:docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
Баррет Кларк
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
    
kweku360
источник
1
Сначала нужно остановить контейнер и удалить его, обратитесь к stackoverflow.com/questions/21398087/…
vikramvi
37

Образ:

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

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

  2. Удалить одно изображение

    Докер rmi image_name

  3. Принудительно удалить одно изображение

    докер rmi -f изображение_имя

Контейнер:

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

    докер ps -a

  2. Удалить один контейнер

    docker rm container_id

  3. Принудительно удалить один контейнер

    docker rm -f container_id

код хакфокса
источник
29

Обновление, как прокомментировал VonC в Как удалить старые контейнеры Docker .

С Docker 1.13 (4 квартал 2016 года) у вас теперь есть:

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

См. PR 26108 и commit 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
qkrijger
источник
Спасибо за исчерпывающий ответ, но это не дает прямого ответа на первоначальный вопрос (на который уже дан ответ, и чей топ-ответ по-прежнему актуален).
Жюль
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 состоят из нескольких изображений.

    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

Удалить один или несколько контейнеров

rmi Удалить одно или несколько изображений

КунМин Се
источник
Спасибо, но на этот вопрос уже есть несколько ответов и отобранный ответ, который решил проблему почти 3 года назад.
Жюль
13
docker rmi  91c95931e552

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

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

# docker ps -a

# docker rm  daf644660736 
lakshmikandan
источник
Это ответ на вопрос?
Питер Мортенсен
Почему 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

От: Представляем Docker 1.13

CLI реструктурирован

В Docker 1.13 мы перегруппировали каждую команду, чтобы она находилась под логическим объектом, с которым она взаимодействует. Например, listи startтеперь контейнеры являются подкомандами docker containerи historyявляются подкомандами docker image.

Эти изменения позволят нам очистить синтаксис Docker CLI, улучшить текст справки и упростить использование Docker. Старый командный синтаксис все еще поддерживается, но мы призываем всех принять новый синтаксис .

tgogos
источник
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: RM их первым

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, если вы получаете сообщение о том, что его нельзя удалить из-за дочерних зависимостей

chandank
источник
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решение (не требующее использования часто придирчивых конфигов docker-compose.yml). Кроме того, здесь уже есть много хороших ответов.
Жюль
@ Джулс, никто не упомянул 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
Julisch
источник
-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

user1833058
источник
-1

В моем случае проблема в том, что у меня есть буксируемые изображения с тем же именем, решение заключается в добавлении тега после имени или идентификатора

sudo docker rmi <NAME>:<TAG>

например:

sudo docker rmi php:7.0.4-fpm
Amirouche Zeggagh
источник