Ответ 1
Вы должны попытаться удалить ненужные изображения перед удалением изображения:
docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
После этого запустите:
docker rmi c565603bc87f
Я пытаюсь
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
Вы должны попытаться удалить ненужные изображения перед удалением изображения:
docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
После этого запустите:
docker rmi c565603bc87f
В некоторых случаях (как в моем случае) вы можете пытаться удалить изображение , указав идентификатор изображения с несколькими тегами, которые, как вы понимаете, не существуют, некоторые из которых могут использоваться другими изображениями. В этом случае вы можете не захотеть удалить изображение.
Если у вас есть случай избыточных тегов, как описано здесь, вместо docker rmi <image_id>
используйте docker rmi <repo:tag>
в избыточном теге, который вы хотите удалить.
найдите идентификатор изображения и родительский идентификатор для всего изображения, созданного после соответствующего изображения, со следующим:
docker inspect --format='{{.Id}} {{.Parent}}' $(docker images --filter since=<image_id> -q)
Затем вы вызываете команду:
docker rmi {sub_image_id}
"sub_image_id" - это идентификатор зависимого изображения
все предыдущие ответы верны, но вот одно решение, которое просто принудительно удаляет все ваши изображения (используйте эту команду на свой страх и риск, она удалит все ваши изображения)
docker rmi $(docker images -q) -f
Что мне работало, так это использование комбинации РЕПОЗИТОР: 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
ЭТА КОМАНДА УДАЛЯЕТ ВСЕ ИЗОБРАЖЕНИЯ (ИСПОЛЬЗУЙТЕ С ОСТОРОЖНОМ)
Вы пытались использовать --force
sudo docker rmi $(sudo docker images -aq) --force
Приведенный выше код работает как шарм даже у меня была та же проблема
Здесь скрипт для удаления изображения и всех изображений, которые от него зависят.
#!/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
Ответ здесь состоит в том, чтобы найти всех потомков детей, у которых есть ответ здесь:
Докер, как я могу получить список зависимых дочерних изображений?
Затем используйте это, чтобы удалить дочерние изображения по порядку.
Основываясь на Саймон 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>
.
# docker rm $(docker ps -aq)
После этого используйте команду, как предложил Нгуен.
Когда я хочу удалить неиспользуемое изображение с именем "<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>"
удачи
Я также получил эту проблему, я мог решить проблему с помощью нижеприведенных команд. это может быть причиной, контейнер изображения работает или выходит, поэтому перед удалением изображения вам нужно удалить контейнер.
docker ps -a -f status = exited: эта команда показывает все выведенные контейнеры, а затем копирует идентификатор контейнера, а затем запускает ниже команды для удаления контейнера
docker rm #containerId: эта команда удаляет контейнер, это может быть проблемой, которая указывает, что "изображение имеет зависимые дочерние образы"
Затем попробуйте удалить изображение с помощью команды
docker rmi #ImageId
У меня была эта проблема, и ни один из коротких ответов здесь не сработал, даже на странице, упомянутой @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
я использовал, когда впервые начал играть с докером. Это было потому, что я создал новое изображение из первого тестового изображения, которое создало цепочку.
Надеюсь, это поможет кому-то еще в какой-то момент.
Предположим, у нас есть 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
Расширяя ответ, предоставленный @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
Принудительное удаление списка изображений (исключая, например, версию 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
Вы можете просто сделать это:
➜ ~ Sudo Докер RMI 4ed13257bb55 -f Удаленные: sha256: 4ed13257bb5512b975b316ef482592482ca54018a7728ea1fc387e873a68c358 Удаляется: sha256: 4a478ca02e8d2336595dcbed9c4ce034cd15f01229733e7d93a83fbb3a9026d3 Исключено: sha256: 96df41d1ce6065cf75d05873fb1f9ea9fed0ca86addcfcec7722200ed3484c69 Удаляется: sha256: d95efe864c7096c38757b80fddad12819fffd68ac3cc73333ebffaa42385fded
Слой изображения: Хранилища часто называют изображениями или изображениями-контейнерами, но на самом деле они состоят из одного или нескольких слоев. Слои изображения в репозитории связаны друг с другом в родительско-дочерних отношениях. Каждый слой изображения представляет изменения между собой и родительским слоем.
Шаблон построения докера использует наследование. Это означает, что версия 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