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

Я пытаюсь

docker rmi c565603bc87f

Ошибка:

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

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

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

uname -a Linux goracio-pc 4.4.0-24-generiС# 43-Ubuntu SMP Wed Jun 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 Построено: Wed Jun 1 22:00:43 2016 OS/Arch: linux/amd64

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

Ответы

Ответ 1

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

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

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

docker rmi c565603bc87f

Ответ 2

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

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

Ответ 3

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

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

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

docker rmi {sub_image_id} 

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

Ответ 4

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

docker rmi $(docker images -q) -f

enter image description here

Ответ 5

Что мне работало, так это использование комбинации РЕПОЗИТОР: 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

Ответ 6

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

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

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

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

Ответ 7

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

#!/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

Ответ 9

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

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>.

Ответ 10

# docker rm $(docker ps -aq)

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

Ответ 11

Когда я хочу удалить неиспользуемое изображение с именем "<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>"

удачи

Ответ 12

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

docker ps -a -f status = exited: эта команда показывает все выведенные контейнеры, а затем копирует идентификатор контейнера, а затем запускает ниже команды для удаления контейнера

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

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

docker rmi #ImageId

Ответ 13

У меня была эта проблема, и ни один из коротких ответов здесь не сработал, даже на странице, упомянутой @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 изображением myrepo/getstarted-lab я использовал, когда впервые начал играть с докером. Это было потому, что я создал новое изображение из первого тестового изображения, которое создало цепочку.

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

Ответ 14

Предположим, у нас есть 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

Ответ 15

Расширяя ответ, предоставленный @Nguyen - эту функцию можно добавить в ваш .bashrc и т.д., А затем вызывать из командной строки, чтобы помочь устранить любые 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

Ответ 16

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

docker images | grep version | grep -v version10 > images.txt && for img in $( awk -F" " '{print $3}'/root/images.txt ); do docker rmi -f $img; done

Ответ 17

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

➜ ~ Sudo Докер RMI 4ed13257bb55 -f Удаленные: sha256: 4ed13257bb5512b975b316ef482592482ca54018a7728ea1fc387e873a68c358 Удаляется: sha256: 4a478ca02e8d2336595dcbed9c4ce034cd15f01229733e7d93a83fbb3a9026d3 Исключено: sha256: 96df41d1ce6065cf75d05873fb1f9ea9fed0ca86addcfcec7722200ed3484c69 Удаляется: sha256: d95efe864c7096c38757b80fddad12819fffd68ac3cc73333ebffaa42385fded

Ответ 18

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

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

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

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

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

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