Не удается удалить изображение докера с зависимыми дочерними изображениями

164

я пытаюсь

docker rmi c565603bc87f

Ошибка:

Ошибка от демона: конфликт: невозможно удалить c565603bc87f (нельзя принудительно) - изображение имеет зависимые дочерние изображения

Поэтому я не могу удалить изображение даже с флагом -f. Как удалить изображение тогда и всех его детей?

Версия для Linux и докера:

uname -a Linux goracio-pc 4.4.0-24-generic # 43-Ubuntu SMP Ср 8 июня 19:27:37 UTC 2016 x86_64 x86_64 x86_64 GNU / Linux

версия докера Клиент: версия: 1.11.2 версия API: 1.23 версия Go: go1.5.4 Git commit: b9f10c9 Построен: ср 1 июн 22:00:43 2016 OS / Arch: linux / amd64

Сервер: Версия: 1.11.2 Версия API: 1.23 Версия Go: go1.5.4 Git commit: b9f10c9 Построен: Ср 1 Июн 22:00:43 2016 OS / Arch: linux / amd64

Римский
источник
может быть, это может помочь: gist.github.com/Siva-Charan/db7bd84ad2ca2b0779d87a75e6bb4176
Гуджарат Сантана
2
Удалить по тегу от самого нового до самого старого. Если они живут в репо, они будут извлечены, если того требует любой Dockerfile.
rafaelbattesti
Вы должны принять (очень хороший) ответ, предоставленный Нгуеном
jpw

Ответы:

119

Вы должны попытаться удалить ненужные изображения перед удалением изображения:

docker rmi $(docker images --filter "dangling=true" -q --no-trunc)

После этого запустите:

docker rmi c565603bc87f
Нгуен Си Тхань Сон
источник
13
Там нет никаких висячих изображений ... Docker images -f dangling = true -> Nothing
Roman
39
Этот ответ отвечает на другой вопрос "Как удалить висящие изображения?" Вопрос ОП: «Как удалить зависимые изображения?»
Tu-Reinstate Моника-Дор Дух
6
Чтобы удалить оборванных изображения, просто использоватьprune
Дэцин
17
эта команда больше не работает:> "docker rmi" requires at least 1 argument.
samayo
2
@samayo если вы получаете эту ошибку, попробуйте изменить фильтрующую часть к: --filter=dangling=true. Если вы по-прежнему получаете эту ошибку, это просто означает, что у вас нет висячих изображений, и поэтому команда in-set оценивается как пустая строка.
HammerN'Songs
100

В некоторых случаях (как в моем случае) вы можете пытаться удалить изображение , указав идентификатор изображения с несколькими тегами, которые, как вы понимаете, не существуют, некоторые из которых могут использоваться другими изображениями. В этом случае вы можете не захотеть удалить изображение .

Если у вас есть случай избыточных тегов, как описано здесь, вместо docker rmi <image_id>использования docker rmi <repo:tag>избыточного тега вы хотите удалить.

bbarker
источник
11
docker rmi <repo:tag>работал для меня. Ваше решение довольно простое среди этих ответов, спасибо.
Шихе Чжан
это должен быть верный способ сделать это для моего случая с удаленными старыми изображениями Голанга
храм
Это был билет для меня, спасибо. Untagged: drud/ddev-webserver:20200301_leymannx_apache-junk-built
rfay
Если кто-либо установил образцы Microsoft eShopOnContainers, вам абсолютно необходимо удалить каждый из них таким образом, repo:tagпоскольку он создает восемь изображений с тегами, которые имеют только два идентификатора изображения. Даже Visual Studio не удалит их в своем окне управления контейнерами ...
mdisibio
Команда docker rmi <repo:tag>только снимает метки , она не обязательно удаляет изображение. Если существует более одного тега, ссылающегося на это изображение, или если существует другая проблема, например, та, которая указана в OP, изображение все равно будет там. Вы можете проверить, что изображение все еще существует с помощью команды docker images ls --all.
twan163
50

все предыдущие ответы верны, но вот одно из решений, которое просто принудительно удаляет все ваши изображения ( используйте эту команду на свой страх и риск, она удалит все ваши изображения )

docker rmi $(docker images -q) -f

введите описание изображения здесь

grepit
источник
1
Это сработало для меня; Я просто хотел сдуть все мои местные образы. Обратите внимание, мне пришлось обновить для работы с версией моего докера (18.09.7): docker image rm $(docker image ls -a -q) -f
akagixxer
40

найдите идентификатор изображения и идентификатор родителя для всех изображений, созданных после рассматриваемого изображения, с помощью следующего:

docker inspect --format='{{.Id}} {{.Parent}}' $(docker images --filter since=<image_id> -q)

Затем вы вызываете команду:

docker rmi {sub_image_id} 

«sub_image_id» - это идентификатор зависимого изображения

Нгуен Ву Куанг
источник
Так что хорошо, чтобы удалить промежуточные изображения конкретного изображения. Спасибо!!
Виллегас
неизвестный флаг --filter: /
SamuraiJack
Кажется, это и есть реальное решение вопроса!
Паоло
28

Что мне работало, так это использование комбинации РЕПОЗИТОР: TAG, а не ID ИЗОБРАЖЕНИЯ.

Когда я попытался удалить образ докера с помощью команды docker rmi <IMAGE ID>без контейнеров, связанных с этим образом, у меня появилось сообщение:

$ docker rmi 3f66bec2c6bf
Error response from daemon: conflict: unable to delete 3f66bec2c6bf (cannot be forced) - image has dependent child images

Я мог удалить с успехом, когда я использовал команду docker rmi RPOSITORY:TAG

$ docker rmi ubuntu:18.04v1
Untagged: ubuntu:18.04v1
Эду Коста
источник
На самом деле. Любое объяснение, почему это странное поведение?
RodrigoM
1
Это сработало и для меня. В моем случае у меня было устаревшее изображение Ubuntu, оно не упоминалось ни в каком другом изображении как родительское, но все равно не могло быть удалено. docker rmi 93fd78260bd1не удалось, но затем docker tag 93fd78260bd1 ubuntu:temp && docker rmi ubuntu:tempбыл успешным.
Томас Лобкер
работа для меня, также обновлял устаревшее изображение. Кто-нибудь знает, почему он не работает W ID?
Холстомер
3
Это на самом деле не удаляет изображение. Он просто удаляет дубликат тега для этого изображения (отсюда и сообщение Untagged: ubuntu:18.04v1). Если вы это сделаете docker images -a, вы, вероятно, увидите 3f66bec2c6bfеще в списке. Если изображение было действительно удалено, вы получите сообщениеDeleted: 3f66bec2c6bf
wisbucky
17

ЭТА КОМАНДА УДАЛЯЕТ ВСЕ ИЗОБРАЖЕНИЯ (ИСПОЛЬЗУЙТЕ С ОСТОРОЖНОМ)

Вы пытались использовать --force

sudo docker rmi $(sudo docker images -aq) --force

Приведенный выше код работает как шарм даже у меня была та же проблема

Dapter20
источник
1
Я остановил sudo в обоих местах, и это отлично сработало для меня
user2217751
7

Ответ здесь заключается в том, чтобы найти всех потомков детей, у которых есть ответ здесь:

Докер, как я могу получить список зависимых дочерних изображений?

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

Tu-Reinstate Моника-Дор Дух
источник
9
Вы уже разработали этот сценарий?
ТТ.
1
Я пошел дальше и конкретизировал это в своем сценарии ниже.
Ограниченное искупление
6

Вот скрипт для удаления изображения и всех изображений, которые зависят от него.

#!/bin/bash

if [[ $# -lt 1 ]]; then
    echo must supply image to remove;
    exit 1;
fi;

get_image_children ()
{
    ret=()
    for i in $(docker image ls -a --no-trunc -q); do
        #>&2 echo processing image "$i";
        #>&2 echo parent is $(docker image inspect --format '{{.Parent}}' "$i")
        if [[ "$(docker image inspect --format '{{.Parent}}' "$i")" == "$1" ]]; then
            ret+=("$i");
        fi;
    done;
    echo "${ret[@]}";
}

realid=$(docker image inspect --format '{{.Id}}' "$1")
if [[ -z "$realid" ]]; then
    echo "$1 is not a valid image.";
    exit 2;
fi;
images_to_remove=("$realid");
images_to_process=("$realid");
while [[ "${#images_to_process[@]}" -gt 0 ]]; do
    children_to_process=();
    for i in "${!images_to_process[@]}"; do
        children=$(get_image_children "${images_to_process[$i]}");
        if [[ ! -z "$children" ]]; then
            # allow word splitting on the children.
            children_to_process+=($children);
        fi;
    done;
    if [[ "${#children_to_process[@]}" -gt 0 ]]; then
        images_to_process=("${children_to_process[@]}");
        images_to_remove+=("${children_to_process[@]}");
    else
        #no images have any children. We're done creating the graph.
        break;
    fi;
done;
echo images_to_remove = "$(printf %s\n "${images_to_remove[@]}")";
indices=(${!images_to_remove[@]});
for ((i="${#indices[@]}" - 1; i >= 0; --i)) ; do
    image_to_remove="${images_to_remove[indices[i]]}"
    if [[ "${image_to_remove:0:7}" == "sha256:" ]]; then
        image_to_remove="${image_to_remove:7}";
    fi
    echo removing image "$image_to_remove";
    docker rmi "$image_to_remove";
done
Ограниченное искупление
источник
6
# docker rm $(docker ps -aq)

После этого используйте команду, как предложил Нгуен.

Camino
источник
4

Основываясь на методе грубой силы Симона Брейди здесь , если вы не имеете тонну изображений вы можете использовать эту функцию оболочки:

recursive_remove_image() {
  for image in $(docker images --quiet --filter "since=${1}")
  do
    if [ $(docker history --quiet ${image} | grep ${1}) ]
    then
      recursive_remove_image "${image}"
    fi
  done
  echo "Removing: ${1}"
  docker rmi -f ${1}
}

а затем позвоните, используя recursive_remove_image <image-id>.

сентиментальный
источник
4
docker rmi <rep:tag>

Пример:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python              3.6            60f85556d5d2        4 days ago          174MB

докер rmi python: 3.6

CamXiMuoi
источник
3

Когда я хочу удалить неиспользуемое изображение с именем "<none>"в докере, я сталкиваюсь с проблемой. Так unable to delete a354bbc7c9b7 (cannot be forced) - image has dependent child imagesчто для решения этой проблемы:

судо докер ps -a

CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                         PORTS                                              NAMES
01ee1276bbe0        lizard:1                    "/bin/sh -c 'java ..."   About an hour ago   Exited (1) About an hour ago                                                      objective_lewin
49d73d8fb023        javaapp:latest              "/usr/bin/java -ja..."   19 hours ago        Up 19 hours                    0.0.0.0:8091->8091/tcp                             pedantic_bell
405fd452c788        javaapp:latest              "/usr/bin/java -ja..."   19 hours ago        Created                                                                           infallible_varahamihira
532257a8b705        javaapp:latest              "/usr/bin/java -ja..."   19 hours ago        Created                                                                           demo-default
9807158b3fd5        javaapp:latest              "/usr/bin/java -ja..."   19 hours ago        Created                                                                           xenodochial_kilby
474930241afa        jenkins                     "/bin/tini -- /usr..."   13 days ago         Up 4 days                      0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp   myjenkins
563d8c34682f        mysql/mysql-server:latest   "/entrypoint.sh my..."   3 weeks ago         Up 4 days (healthy)            0.0.0.0:3306->3306/tcp, 33060/tcp                  mymysql
b4ca73d45d20        phpmyadmin/phpmyadmin       "/run.sh phpmyadmin"     4 weeks ago         Exited (0) 3 weeks ago                                                            phpmyadmin

Вы можете видеть, что у меня есть несколько изображений с именем javaapp: последний и другое имя контейнера. Итак, я убил и удалил весь контейнер контейнера "javaapp: latest":

остановка доко sudo "containerName"

sudo docker rm "serverName"

затем

sudo docker rmi -f "imageId"

Так что я могу удалить все изображения с именем "<none>"

удачи

Саман Салехи
источник
1

Я также получил эту проблему, я мог решить проблему с помощью следующих команд. это может быть причиной, контейнер изображения работает или выход, поэтому перед удалением изображения необходимо удалить контейнер

docker ps -a -f status = exited: эта команда отображает все вышедшие контейнеры, поэтому скопируйте Id контейнера и выполните команды ниже, чтобы удалить контейнер

docker rm #containerId: эта команда удалить контейнер, это может быть проблема, которая упоминает "изображение имеет зависимые дочерние изображения"

Затем попробуйте удалить изображение с помощью команды ниже

Докер rmi #ImageId

Дамит Асанка
источник
1

У меня была эта проблема, и ни один из коротких ответов здесь не работал, даже на странице, упомянутой @tudor выше. Я думал, что поделюсь здесь, как я избавился от изображений. Мне пришла в голову мысль, что зависимые изображения должны быть> = размера родительского изображения, что помогает идентифицировать его, чтобы мы могли его удалить.

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

docker images --format '{{.Size}}\t{{.Repository}}\t{{.Tag}}\t{{.ID}}' | sort -h -r | column -t

Для этого нужно использовать специальное форматирование из докера, чтобы сначала расположить столбец с размером изображения, а затем выполнить сортировку, читаемую человеком, в обратном порядке. Затем я восстанавливаю легко читаемые столбцы.

Затем я посмотрел на <none>контейнеры и сопоставил первый в списке с аналогичным размером. Я выполнил простое docker rmi <image:tag>на этом изображении, и все <none>дочерние изображения пошли вместе с ним.

Проблемное изображение со всеми дочерними изображениями на самом деле было чертовым myrepo/getstarted-lab изображением, которое я использовал, когда впервые начал играть с докером. Это потому, что я создал новое изображение из первого тестового изображения, которое создало цепочку.

Надеюсь, это поможет кому-то еще в какой-то момент.

Крис Гиллатт
источник
1

Предположим, у нас есть Dockerfile

FROM ubuntu:trusty
CMD ping localhost

Мы строим образ из этого без TAG или именования

docker build .

Теперь у нас есть отчет об успехе «Успешно построенный 57ca5ce94d04». Если мы видим образ докера

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              57ca5ce94d04        18 seconds ago      188MB
ubuntu              trusty              8789038981bc        11 days ago         188MB

Нам нужно сначала удалить docker rmi 57ca5ce94d04

С последующим

docker rmi 8789038981bc

По этому изображению будут удалены!

Принудительное удаление всего, как это было предложено кем-то

docker rmi $(docker images -q) -f
Вимал Кришна
источник
1

Расширяя ответ, предоставленный @Nguyen - эта функция может быть добавлена ​​в ваш .bashrcetc и затем вызвана из командной строки, чтобы помочь устранить любые image has dependent child imagesошибки ...

Вы можете запустить функцию как вы сами, и в случае docker psсбоя она запустит dockerкоманду sudoи запросит у вас пароль.

Есть ли НЕ удалять изображения для любых запущенных контейнеров!

docker_rmi_dependants ()                                                                                                                                                         
{ 
  DOCKER=docker
  [ docker ps >/dev/null 2>&1 ] || DOCKER="sudo docker"

  echo "Docker: ${DOCKER}"

  for n in $(${DOCKER} images | awk '$2 == "<none>" {print $3}');
  do  
    echo "ImageID: $n";
    ${DOCKER} inspect --format='{{.Id}} {{.Parent}}' $(${DOCKER} images --filter since=$n -q);
  done;

  ${DOCKER} rmi $(${DOCKER} images | awk '$2 == "<none>" {print $3}')
}

У меня также есть это в моем .bashrcфайле ...

docker_rm_dangling ()  
{ 
  DOCKER=docker
  [ docker ps >/dev/null 2>&1 ] || DOCKER="sudo docker"

  echo "Docker: ${DOCKER}"

  ${DOCKER} images -f dangling=true 2>&1 > /dev/null && YES=$?;                                                                                                                  
  if [ $YES -eq 1 ]; then
    read -t 30 -p "Press ENTER to remove, or CTRL-C to quit.";
    ${DOCKER} rmi $(${DOCKER} images -f dangling=true -q);
  else
    echo "Nothing to do... all groovy!";
  fi  
}

Работает с:

$ docker --version 
Docker version 17.05.0-ce, build 89658be
Android Control
источник
0

Принудительное удаление списка изображений (исключая, например, версию 10)

докер изображения | версия grep | grep -v version10> images.txt && для img в $ (awk -F "" '{print $ 3}' /root/images.txt); do docker rmi -f $ img; сделано

Нехла Карим
источник
-1

Вы можете просто сделать это:

➜ ~ Судо докер RMI 4ed13257bb55 -f Исключено: sha256: 4ed13257bb5512b975b316ef482592482ca54018a7728ea1fc387e873a68c358 Исключено: sha256: 4a478ca02e8d2336595dcbed9c4ce034cd15f01229733e7d93a83fbb3a9026d3 Исключено: sha256: 96df41d1ce6065cf75d05873fb1f9ea9fed0ca86addcfcec7722200ed3484c69 Исключено: sha256: d95efe864c7096c38757b80fddad12819fffd68ac3cc73333ebffaa42385fded

Неназванный-бык
источник
-1

Слой изображения: хранилища часто называют изображениями или изображениями-контейнерами, но на самом деле они состоят из одного или нескольких слоев. Слои изображений в репозитории связаны друг с другом в родительско-дочерних отношениях. Каждый слой изображения представляет изменения между собой и родительским слоем.

Шаблон построения докера использует наследование . Это означает, что версия iзависит от версии i-1. Таким образом, мы должны удалить версию, i+1чтобы иметь возможность удалить версию i. Это простая зависимость.

Если вы хотите удалить все изображения, кроме последнего (наиболее обновленного) и первого (базового), мы можем экспортировать последнее (наиболее обновленное) с помощью docker saveкоманды, как показано ниже.

docker save -o <output_file> <your_image-id> | gzip <output_file>.tgz

Затем удалите все изображения, используя идентификатор изображения, как показано ниже.

docker rm -f <image-id i> | docker rm -f <image i-1> | docker rm -f <image-id i-2> ... <docker rm -f <image-id i-k> # where i-k = 1

Теперь загрузите сохраненное изображение TGZ, как показано ниже.

gzip -c <output_file.tgz> | docker load

посмотрите идентификатор вашего загруженного изображения, используя docker ps -q. У него нет тега и имени. Вы можете просто обновить тег и имя, как сделано ниже.

docker tag <image_id> group_name/name:tag
Уддхав Гаутам
источник