2016-04-12 32 views
41

Sto cercando di rimuovere un'immagine e ottengo:finestra mobile come posso ottenere l'elenco delle immagini figlio dipendenti?

# 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 

Questa è la versione finestra mobile:

# 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 

ma non v'è alcuna informazione in più:

# 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 

Come può Ricevo le immagini figlio dipendenti che dichiara di avere?

non ci sono contenitori in esecuzione o fermati con quell'ID immagine.

risposta

20

Risposta breve: Here is a python3 script che elenca le immagini docker dipendenti.

Risposta lunga: Si può vedere l'ID immagine e ID principale per tutti immagine creata dopo l'immagine in questione con il seguente:

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

Si dovrebbe essere in grado di cercare le immagini con genitore id a cominciare f50f9524513f, quindi cercare le immagini del bambino di quelli, ecc .. Ma .Parentisn’t what you think., così nella maggior parte dei casi si avrebbe bisogno di specificare docker images --all cui sopra per effettuare quel lavoro, allora si otterrà gli iD di immagine per tutti i intermedia anche i livelli.

Ecco uno script python3 più limitato per analizzare l'output finestra mobile e fare la ricerca per generare l'elenco delle immagini:

#!/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)))) 

Se si salva questo come desc.py si poteva invocarlo come segue:

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

O semplicemente utilizzare the gist above, che fa la stessa cosa.

+1

E se nessuno di loro inizia con i caratteri previsti? Indica un possibile bug? Sono su Docker per Mac beta, FWIW, quindi non mi sorprenderebbe. – neverfox

+0

O è un bug, o significa che l'immagine in questione non ha figli. –

+2

Questo in realtà non risponde alla domanda originale. Questo mostra cosa è stato creato dopo l'immagine in questione, che può dipendere o meno dall'immagine che il poster stava cercando di eliminare. La risposta di Simon Brady fa il trucco, per almeno piccole dimensioni del campione di immagini. – penguincoder

21

Se non si dispone di un numero enorme di immagini, c'è sempre l'approccio a forza bruta:

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

Penso che questa sia la "migliore" soluzione.È possibile espandere un po 'questo aspetto e rendere un po' più chiaro cosa è cosa cambiando le immagini del docker da 'echo $ 1' a quelle più brutte (ma ancora brute-forcy) | grep $ i' (più portabile nelle versioni docker che usare i flag '--filter' per Image Id) –

1

È possibile eliminare le immagini Docker indipendentemente dal genitore e relazione bambino attraverso la sotto directory di Docker

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

In questa directory è possibile trovare le immagini di Docker, in modo da poter eliminare ciò che si desidera.

+0

Sto provando a creare comandi portatili usando l'API docker, supponendo il mapper del dispositivo e il motore mobile (al posto dello swarm docker per esempio) rende questa una soluzione non portabile. È anche rischioso eliminare i file nel filesystem mentre altri processi (incluso il daemon docker) potrebbero usarlo. – nicocesar

+0

dov'è su macos? –

7

Installare dockviz e seguire i rami dall'immagine id nella vista ad albero:

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

meglio fare 'sudo apt-get update; sudo apt-get install golang-go; esporta GOPATH = $ HOME/.go' prima. – loretoparisi

0

Questo è quello che ho fatto, al fine di preservare la mia "immagine" finale (strato, in realtà - che è quello che mi ha buttato fuori, come sto appena entrando in build docker).

Stavo ricevendo il messaggio "... non può essere forzato ...".Mi sono reso conto che non potevo eliminare le immagini di cui non avevo bisogno perché non sono realmente immagini indipendenti create da 'docker commit'. Il mio problema era che avevo diverse immagini (o livelli) tra l'immagine di base e la mia finale, e solo cercando di ripulire è dove ho incontrato l'errore/avvertimento sul figlio e sul genitore.

  1. Ho esportato l'immagine finale (o il livello, se lo si desidera) in un tarball.
  2. Poi ho cancellato tutte le immagini che volevo, inclusa la mia finale - l'ho salvata in un tarball quindi, mentre non ero sicuro di poterlo usare, stavo solo sperimentando.
  3. Ho quindi eseguito "caricamento immagine docker -i FinalImage.tar.gz". L'output era simile a: 7d9b54235881: strato di caricamento [====================================== ============>] 167.1MB/167.1MB c044b7095786: Caricamento strato [========================= =========================>] 20.89MB/20.89MB fe94dbd0255e: Caricamento strato [============ ======================================>] 42.05MB/42.05MB 19abaa1dc0d4: strato di Caricamento [================================================= =>] 37.96MB/37.96MB 4865d7b6fdb2: Caricamento strato [==================================== ==============>] 169.6MB/169.6MB a0c115c7b87c: Caricamento strato [======================= =============] 132MB/132MB ID immagine caricato: sha256: 82d4f8ef9ea1eab72d989455728762ed3c0fe35fd85acf9edc47b41dacfd6382

Ora, quando elenco con 'immagine docker ls', ho solo l'immagine di base originale e l'immagine finale che ho precedentemente salvato in un tarball.

[root @ docker1 ~] # docker immagine ls repository di tag ID immagine CREATO TAGLIA httpd importazione 82d4f8ef9ea1 3 giorni fa 747MB CentOS HTTPd 36540f359ca3 5 settimane fa 193MB


Il mio sistema è 'pulito' adesso. Ho solo le immagini che voglio. Ho persino eliminato l'immagine di base senza problemi.

[root @ docker1 ~] # finestra mobile rmi 36540f359ca3 senza tag: CentOS: httpd senza tag: CentOS @ sha256: c1010e2fe2b635822d99a096b1f4184becf5d1c98707cbccae00be663a9b9131 Eliminato: sha256: 36540f359ca3b021d4b6a37815e9177b6c2bb3817598979ea55aee7ecc5c2c1f

0

Ho creato un gist con script di shell per stampare albero discendente di un'immagine docker, se qualcuno fosse interessato a una soluzione bash:

#!/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

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/18102379) –

+0

Ho appena avuto problemi con la formattazione del codice, quindi ho rinunciato, grazie per aver fatto questo gennaio –

Problemi correlati