2016-04-12 5 views
41

Ich versuche, ein Bild zu entfernen, und ich bekomme:docker Wie bekomme ich die Liste der abhängigen Kindbilder?

# 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 

Dies ist die Docker Version:

# 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 

aber es gibt keine zusätzliche Informationen:

# 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 

Wie kann Ich bekomme die abhängigen Kind Bilder es behauptet zu haben?

Es gibt keine laufenden oder gestoppten Container mit dieser Image-ID.

Antwort

20

Kurze Antwort: Here is a python3 script, die abhängige Docker-Bilder auflistet.

Lange Antwort: Sie können die Bild-ID und Eltern-ID für alle nach dem Bild in Frage mit dem geschaffenen Bild sehen folgend:

docker inspect --format='{{.Id}} {{.Parent}}' \ 
    $(docker images --filter since=f50f9524513f --quiet) 

Sie sollten für Bilder mit Eltern-ID aussehen können mit f50f9524513f beginnen, dann suchen Sie für die Kinderbilder von jene, etc .. Aber.Parentisn’t what you think., so in den meisten Fällen müssen Sie docker images --all oben angeben, um diese Arbeit zu machen, dann werden Sie Bild-IDs für alle inter bekommen te Schichten auch.

Hier ist ein begrenzter python3 Skript die Docker Ausgabe und tun, um die Suche zu analysieren, um die Liste der Bilder zu erzeugen:

#!/usr/bin/python3 
import sys 

def desc(image_ids, links): 
    if links: 
     link, *tail = links 
     if len(link) > 1: 
      image_id, parent_id = link 
      checkid = lambda i: parent_id.startswith(i) 
      if any(map(checkid, image_ids)): 
       return desc(image_ids | {image_id}, tail) 
     return desc(image_ids, tail) 
    return image_ids 


def gen_links(lines): 
    parseid = lambda s: s.replace('sha256:', '') 
    for line in reversed(list(lines)): 
     yield list(map(parseid, line.split())) 


if __name__ == '__main__': 
    image_ids = {sys.argv[1]} 
    links = gen_links(sys.stdin.readlines()) 
    trunc = lambda s: s[:12] 
    print('\n'.join(map(trunc, desc(image_ids, links)))) 

Wenn Sie dies als desc.py speichern Sie aufrufen könnte wie folgt aussehen:

docker images \ 
    | fgrep -f <(docker inspect --format='{{.Id}} {{.Parent}}' \ 
     $(docker images --all --quiet) \ 
     | python3 desc.py f50f9524513f) 

Oder verwenden Sie einfach the gist above, die das gleiche tut.

+1

Was ist, wenn keiner von ihnen mit den erwarteten Zeichen beginnt? Zeigt das einen möglichen Fehler an? Ich bin auf Docker für Mac Beta, FWIW, also würde mich das nicht überraschen. – neverfox

+0

Entweder ist es ein Fehler, oder es bedeutet, dass das fragliche Bild keine Kinder hat. –

+2

Dies beantwortet nicht wirklich die ursprüngliche Frage. Dies zeigt an, was nach dem fraglichen Bild erstellt wurde, das möglicherweise von dem Bild abhängt, das das Poster löschen wollte. Simon Brady's Antwort macht den Trick, zumindest für kleine Stichprobengrößen von Bildern. – penguincoder

21

Wenn Sie nicht über eine große Anzahl von Bildern haben, gibt es immer den Brute-Force-Ansatz:

for i in $(docker images -q) 
do 
    docker history $i | grep -q f50f9524513f && echo $i 
done | sort -u 
+0

Ich denke, das ist die "beste" Lösung.Sie können dies ein wenig erweitern und es etwas deutlicher machen, indem Sie das 'echo $ 1' in die hässlicheren (aber immer noch brachialen)' docker images | grep $ i' (in Docker-Versionen portabler als mit '_filter'-Flags für die Image-ID) –

1

Sie können Bilder Docker löschen, unabhängig von Eltern und Kind-Beziehung durch das unter Verzeichnis von Docker

/var/lib/docker/image/devicemapper/imagedb/content/sha256 

In diesem Verzeichnis finden Sie Docker Bilder, damit Sie löschen können, was Sie wollen.

+0

Ich versuche, portable Befehle mithilfe der Docker-API zu erstellen, vorausgesetzt, Device-Mapper und Docker-Engine (im Gegensatz zu Docker-Schwarm für Beispiel) macht dies zu einer nicht portablen Lösung. Außerdem ist es riskant, Dateien im Dateisystem zu löschen, während andere Prozesse (einschließlich des Docker-Daemon) diese verwenden könnten. – nicocesar

+0

wo ist es auf Macos? –

7

dockviz installieren und die Zweigen aus der Bild-ID in der Baumansicht folgen:

go get github.com/justone/dockviz 
$(go env GOPATH)/bin/dockviz images --tree -l 
+0

besser zu tun 'sudo apt-get update; sudo apt-get installieren golang-go; Exportiere zuerst GOPATH = $ HOME/.go'. – loretoparisi

0

Dies ist, was ich tat, um mein letztes „Bild“ (Schicht zu erhalten, wirklich - das, was mir geworfen aus, da ich gerade in Docker Builds komme).

Ich bekam die ganze "... kann nicht erzwungen werden ..." Nachricht.Ich erkannte, dass ich die Bilder, die ich nicht brauchte, nicht löschen konnte, weil sie nicht wirklich unabhängige Bilder waren, die von "docker commit" erstellt wurden. Mein Problem war, ich hatte mehrere Bilder (oder Ebenen) zwischen dem Basisbild und meinem Finale, und nur versuchen zu bereinigen ist, wo ich den Fehler/die Warnung über das Kind und Elternteil traf.

  1. Ich exportiert das endgültige Bild (oder Ebene, wenn Sie so wollen) zu einem Tarball.
  2. Ich löschte dann alle Bilder, die ich wollte, einschließlich meiner endgültigen - ich habe es in einem Tarball so gespeichert, während ich nicht sicher war, ob ich in der Lage wäre, es zu verwenden, experimentierte ich gerade.
  3. Ich lief dann "Docker Bild laden-i FinalImage.tar.gz". Die Ausgabe war so etwas wie: 7d9b54235881: Ladeebene [============================================================ ============>] 167.1MB/167.1MB c044b7095786: Ladeebene [============================== =======================> 20.89MB/20.89MB fe94dbd0255e: Ebene wird geladen [============ ==================================>> 42.05MB/42.05MB 19abaa1dc0d4: Lade-Layer [================================================== =>] 37.96MB/37.96MB 4865d7b6fdb2: Ladeebene [======================================================== ==============>] 169.6MB/169.6MB a0c115c7b87c: Ladeebene [========================= ========================> 132MB/132MB Geladene Bild-ID: sha256: 82d4f8ef9ea1eab72d989455728762ed3c0fe35fd85acf9edc47b41dacfd6382

Jetzt, wenn ich mit 'docker image ls' listet, habe ich nur das ursprüngliche Basisbild und das letzte Bild, das ich zuvor in einem Tarball gespeichert habe.

[root @ docker1 ~] # Docker Bild ls REPOSITORY TAG IMAGE ID ERSTELLT SIZE httpd Import 82d4f8ef9ea1 3 Tage 747MB vor centos httpd 36540f359ca3 vor 5 Wochen 193MB


Mein System ist 'sauber' jetzt. Ich habe nur die Bilder, die ich will. Ich löschte sogar das Basisbild ohne ein Problem.

[root @ docker1 ~] # Docker rmi 36540f359ca3 Untagged: CentOS: httpd Untagged: centos @ sha256: c1010e2fe2b635822d99a096b1f4184becf5d1c98707cbccae00be663a9b9131 Gelöscht: sha256: 36540f359ca3b021d4b6a37815e9177b6c2bb3817598979ea55aee7ecc5c2c1f

0

ich ein gist mit Shell-Skript erstellt haben auszudrucken Abkömmlingsbaum eines Docker-Bildes, sollte jemand an Bash-Lösung interessiert sein:

#!/bin/bash 
parent_short_id=$1 
parent_id=`docker inspect --format '{{.Id}}' $1` 

get_kids() { 
    local parent_id=$1 
    docker inspect --format='ID {{.Id}} PAR {{.Parent}}' $(docker images -a -q) | grep "PAR ${parent_id}" | sed -E "s/ID ([^ ]*) PAR ([^ ]*)/\1/g" 
} 

print_kids() { 
    local parent_id=$1 
    local prefix=$2 
    local tags=`docker inspect --format='{{.RepoTags}}' ${parent_id}` 
    echo "${prefix}${parent_id} ${tags}" 

    local children=`get_kids "${parent_id}"` 

    for c in $children; 
    do 
     print_kids "$c" "$prefix " 
    done 
} 

print_kids "$parent_id" "" 
+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/18102379) –

+0

Ich hatte gerade Schwierigkeiten beim Formatieren des Codes, also gab ich auf, danke, dass ich diesen Jan gemacht habe –