2016-10-13 10 views
3

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

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

Я останавливаю все контейнеры командой docker stop $(docker ps -a -q). После этого я удаляю все busybox изображений по команде docker rmi $(docker images | grep "busybox" | awk '{print $3}'). И я встречаю сообщение об ошибке, как описано выше.

Я показываю docker images | grep busybox и получить информацию, как показано ниже:

busybox    1     47bcc53f74dc  6 months ago  1.113 MB 
busybox    1-uclibc   47bcc53f74dc  6 months ago  1.113 MB 
busybox    1.24    47bcc53f74dc  6 months ago  1.113 MB 
busybox    1.24-uclibc   47bcc53f74dc  6 months ago  1.113 MB 
busybox    1.24.2    47bcc53f74dc  6 months ago  1.113 MB 
busybox    1.24.2-uclibc  47bcc53f74dc  6 months ago  1.113 MB 
busybox    uclibc    47bcc53f74dc  6 months ago  1.113 MB 

Как я могу удалить BusyBox изображения? Спасибо за любые советы.

ответ

2

Предупреждение указывает на то, что некоторые из контейнеров по-прежнему связаны (наследуют) уровни докеров FS, которые вы собираетесь удалить. Нет возможности удалить промежуточные уровни файловой системы докеров без воссоздания дочерних образов на их основе.

Скажем, у вас есть конфигурация, как:

base_layer_A -> base_layer_B 
      \  \_ child_layer_D 
      \__ container C 

... хочу удалить контейнер C и слой А.

Вы не можете сделать это (потому что слой B основан на слой А) , Это наиболее вероятная причина вашей проблемы.

PS: docker images -a может пролить свет вам (маловероятно). Был а «-tree» переключатель один раз, чтобы помочь с таким случаем, но он ушел сейчас, к сожалению


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

#!/usr/bin/env bash 
set -euo pipefail 

for c in $(docker ps -a -f status=exited -f status=created -f status=dead --format="{{.ID}}"); do 
    docker rm $c 
done 
for img in $(docker images -f dangling=true --format="{{.ID}}"); do 
    docker rmi $img 
done 
+0

О, я попробовал вашу команду. Есть ли решения найти относительные изображения и вручную удалить их? Спасибо – tmquang6805

+0

Есть тривиальные способы удаления слоев изображения, не связанных ни с чем (просто выполняется с несколькими командами, совпадающими с тегами «none»). Что касается отображения дерева слоев изображения докеров, была команда для рендеринга таких («-tree», как я уже упоминал), которая была удалена, к сожалению, ничего подобного я не знаю. Хочешь сейчас что-л. как он сам – agg3l

+0

Вы можете приступить к анализу запуска/включения докер-контейнера (с помощью docker ps __- a__, уничтожения или спускания вниз по дереву, тогда – agg3l