Неможливо видалити зображення докера із залежними зображеннями дітей


164

я намагаюся

docker rmi c565603bc87f

Помилка:

Відповідь на помилку від демон: конфлікт: не вдається видалити c565603bc87f (неможливо примусово) - зображення має залежні зображення дитини

Тому я не можу видалити зображення навіть із прапорцем -f. Як видалити зображення тоді та всіх його дітей?

Версія Linux та docker:

uname -a Linux goracio-pc 4.4.0-24-generic # 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 Перейти до версії: go1.5.4 Команда Git: b9f10c9 Побудовано: ср. черв. 22:00:43 2016 ОС / Arch: linux / amd64

Сервер: Версія: 1.11.2 Версія API: 1.23 Перейти до версії: go1.5.4 Команда Git: b9f10c9 Побудовано: ср. Черв., 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 -> Нічого
Roman

39
Ця відповідь відповідає на інше запитання "Як видалити звисаючі зображення?" Питання ОП - "Як видалити залежні зображення?"
tu-Reinstate Monica-dor duh

6
Щоб видалити звисаючі зображення, просто використовуйтеprune
Deqing

17
ця команда більше не працює:> "docker rmi" requires at least 1 argument.
samayo

2
@samayo якщо ви отримуєте цю помилку, спробуйте змінити систему фільтрів частина до: --filter=dangling=true. Якщо ви все-таки отримаєте цю помилку, це просто означає, що у вас немає жодних звисаючих зображень, так що команда, що встановлюється, визначає порожній рядок.
HammerN'Songs

100

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

Якщо у вас є випадок зайвих тегів, як описано тут, замість того, щоб docker rmi <image_id>використовувати docker rmi <repo:tag>надлишковий тег, який ви бажаєте видалити.


11
docker rmi <repo:tag>працював на мене. Ваше рішення досить просте серед цих відповідей, дякую.
Шихе Чжан

це має бути правильним способом зробити це для моєї справи для віддалених старих голанг-зображень
храм

Це був квиток для мене, дякую. Untagged: drud/ddev-webserver:20200301_leymannx_apache-junk-built
rfay

Якщо хтось встановив зразки eShopOnContainers від Microsoft, ви абсолютно повинні видалити кожен таким способом, repo:tagоскільки він створює вісім тегів зображень, що мають лише два ідентифікатори зображення. Навіть Visual Studio не видалить їх у вікні управління контейнерами ...
mdisibio

Команда знімаєdocker rmi <repo:tag> лише теги , вона не обов'язково видаляє зображення. Якщо є більше тегів, на які посилається це зображення, або якщо є інша проблема, наприклад, наприклад, заявлена ​​ОП, зображення все одно буде там. Ви можете перевірити, що зображення все ще існує за допомогою команди docker images ls --all.
twan163

50

всі попередні відповіді правильні, але ось одне рішення - це просто видалити всі ваші зображення насильно ( використовуйте цю команду на свій страх і ризик, вона видалить усі ваші зображення )

docker rmi $(docker images -q) -f

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


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" - ідентифікатор залежного зображення


Так добре видаляти проміжні зображення певного зображення. Дякую!!
A.Villegas

невідомий прапор --фільтр: /
SamuraiJack

Це, здається, є фактичним рішенням питання!
Паоло

28

Для мене працювало використання комбінації REPOSITORY: TAG, а не Ідентифікатор зображення.

Коли я намагався видалити зображення докера з командою 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було успішним.
Томас Лобкер

робота для мене, також було оновлення застарілого зображення. хтось знає, чому це не вдається ід?
стридер

3
Це дійсно не видаляє зображення. Він просто видаляє дублікат тегу для цього зображення (звідси і повідомлення Untagged: ubuntu:18.04v1). Якщо ви зробите це docker images -a, ви, ймовірно, побачите 3f66bec2c6bfвсе ще в списку. Якби зображення було справді видалено, ви отримаєте повідомленняDeleted: 3f66bec2c6bf
wisbucky

17

ЦЕ КОМАНДА ВІДМОВАЄ ВСІ ЗОБРАЖЕННЯ (ВИКОРИСТОВУЙТЕ З ОБЕРЕЖНОЮ)

Ви намагалися використовувати --force

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

Цей вище код працює як шарм навіть у лань у мене була така ж проблема


1
Я покинув судо в обох місцях, і він спрацював для мене чудово
user2217751

7

Відповідь тут - знайти всіх дітей-нащадків, на які тут є відповідь:

docker Як я можу отримати список залежних дитячих зображень?

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


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)

Після цього використовуйте команду, як запропонував Нгуен.


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

docker rmi python: 3.6


3

Коли я хочу видалити невикористане зображення з ім'ям "<none>"в докер, я зіткнувся з проблемою unable to delete a354bbc7c9b7 (cannot be forced) - image has dependent child images. Отже, для вирішення цієї проблеми:

sudo docker 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 "sadržarName"

Тоді

dodo docker rmi -f "imageId"

Тож я можу видалити всі зображення із назвою "<none>"

Щасти


1

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

docker ps -a -f status = вийшов: ця команда показує всі вийшли контейнери, тож скопіюйте id контейнера та запустіть нижче команди, щоб видалити контейнер

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

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

docker 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 - цю функцію можна додати до вашого .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

0

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

зображення докера | grep версія | grep -v версія10> images.txt && для img в $ (awk -F "" '{print $ 3}' /root/images.txt); 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

Потім видаліть усі зображення, використовуючи 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

Тепер завантажте збережене ТГЗ зображення, як показано нижче.

gzip -c <output_file.tgz> | docker load

переглянути ідентифікатор зображення завантаженого зображення за допомогою docker ps -q. У ньому немає тегу та імені. Ви можете просто оновити тег та ім’я, як це зроблено нижче.

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