Estoy tratando de eliminar una imagen y obtengo:
# docker rmi f50f9524513f
Failed to remove image (f50f9524513f): Error response from daemon: conflict: unable to delete f50f9524513f (cannot be forced) - image has dependent child images
Esta es la versión de Docker:
# docker version
Client:
Version: 1.10.3
API version: 1.22
Go version: go1.5.3
Git commit: 20f81dd
Built: Thu Mar 10 21:49:11 2016
OS/Arch: linux/amd64
Server:
Version: 1.10.3
API version: 1.22
Go version: go1.5.3
Git commit: 20f81dd
Built: Thu Mar 10 21:49:11 2016
OS/Arch: linux/amd64
pero no hay información adicional:
# docker images --format="raw" | grep f50f9524513f -C3
repository: debian
tag: 8
image_id: f50f9524513f
created_at: 2016-03-01 18:51:14 +0000 UTC
virtual_size: 125.1 MB
repository: debian
tag: jessie
image_id: f50f9524513f
created_at: 2016-03-01 18:51:14 +0000 UTC
virtual_size: 125.1 MB
¿Cómo puedo obtener las imágenes de los hijos dependientes que afirma tener?
no hay contenedores en ejecución ni detenidos con esa identificación de imagen.
linux
docker
containers
nicocesar
fuente
fuente
Respuestas:
Respuesta corta: aquí hay una secuencia de comandos de python3 que enumera las imágenes de Docker dependientes.
Respuesta larga: puede ver la identificación de la imagen y la identificación principal de todas las imágenes creadas después de la imagen en cuestión con lo siguiente:
Debería poder buscar imágenes con una identificación principal que comience con f50f9524513f, luego buscar imágenes secundarias de esas , etc. Pero
.Parent
no es lo que piensa. , por lo que en la mayoría de los casos necesitará especificardocker images --all
arriba para que funcione, luego obtendrá los identificadores de imagen para todas las capas intermedias también.Aquí hay una secuencia de comandos de python3 más limitada para analizar la salida de la ventana acoplable y hacer la búsqueda para generar la lista de imágenes:
Si guarda esto,
desc.py
podría invocarlo de la siguiente manera:O simplemente use la esencia de arriba , que hace lo mismo.
fuente
Si no tiene una gran cantidad de imágenes, siempre existe el enfoque de fuerza bruta:
fuente
echo $1
a lo más feo (pero aún por fuerza bruta)docker images | grep $i
(más portátil en las versiones de Docker que usando--filter
banderas para el ID de imagen)Instale dockviz y siga las ramas desde la identificación de la imagen en la vista de árbol:
fuente
sudo apt-get update ; sudo apt-get install golang-go; export GOPATH=$HOME/.go
primero.brew install dockviz
Creé una esencia con un script de shell para imprimir el árbol descendiente de una imagen de Docker, en caso de que alguien esté interesado en la solución de bash:
fuente
Esto es lo que hice para preservar mi "imagen" final (capa, en realidad, que es lo que me desconcertó, ya que estoy entrando en las compilaciones de Docker).
Estaba recibiendo el mensaje completo "... no se puede forzar ...". Me di cuenta de que no podía eliminar las imágenes que no necesitaba porque no son imágenes realmente independientes creadas por 'docker commit'. Mi problema fue que tenía varias imágenes (o capas) entre la imagen base y mi imagen final, y solo tratando de limpiar es donde encontré el error / advertencia sobre el niño y el padre.
docker image load -i FinalImage.tar.gz
. La salida fue algo como:ID de imagen cargada: sha256: 82d4f8ef9ea1eab72d989455728762ed3c0fe35fd85acf9edc47b41dacfd6382
Ahora, cuando hago una lista con 'docker image ls', solo tengo la imagen base original y la imagen final que guardé previamente en un tarball.
Mi sistema está "limpio" ahora. Solo tengo las imágenes que quiero. Incluso borré la imagen base sin problemas.
fuente
Basado en las respuestas de Slushy y Michael Hoffman , si no tiene un montón de imágenes, puede usar esta función de shell:
y luego llámalo usando
fuente
Aquí hay una solución basada en la API de Python (
pip install docker
) que enumera de forma recursiva los descendientes junto con sus etiquetas (si las hay), aumentando la sangría según la profundidad de la relación (hijos, nietos, etc.):Ejemplo:
Lo he puesto a disposición como resumen en https://gist.github.com/simleo/10ad923f9d8a2fa410f7ec2d7e96ad57
fuente
A continuación, se muestra una forma sencilla de obtener una lista de imágenes secundarias que dependen de una imagen principal:
Eso generará una lista de ID de imágenes de padres / hijos, por ejemplo (truncado por brevedad):
El lado izquierdo es el ID de la imagen secundaria, el lado derecho es el ID de la imagen principal que estamos tratando de eliminar, pero dice "la imagen tiene imágenes secundarias dependientes". Esto nos dice que
abcdefghijkl
es el niño del que depende123456789012
. Así que primero tenemos que hacerlodocker rmi abcdefghijkl
, luego tú puedesdocker rmi 123456789012
.Ahora, puede haber una cadena de imágenes de niños dependientes, por lo que es posible que deba seguir repitiendo para encontrar al último niño.
fuente
Puede eliminar imágenes de Docker independientemente de la relación entre padres e hijos a través del siguiente directorio de Docker
En este directorio puedes encontrar imágenes de Docker, para que puedas borrar lo que quieras.
fuente
/var/lib/docker
directamente a manoQué tal si:
Imprimirá las identificaciones de la imagen del niño, con el
sha256:
prefijo.También tuve lo siguiente, que agrega los nombres:
ID=
Obtiene la identificación completa de la imagenIMAGES=
Obtiene todas las imágenes secundarias que tienen esta imagen en la listaImage
echo...
Elimina duplicados y hace eco de los resultadosfuente
Hice esto para encontrar niños de forma recursiva, sus etiquetas de repositorio e imprimir lo que están haciendo:
No olvide eliminar / tmp / dii- * si su host no es seguro.
fuente
También me enfrentaba al mismo problema. Pasos seguidos a continuación para resolver el problema.
Detener todos los contenedores en ejecución
docker stop $ (docker ps -aq) Eliminar todos los contenedores
docker rm $ (docker ps -aq) Eliminar todas las imágenes
docker rmi $ (imágenes de docker -q)
fuente