Jika Anda tidak memiliki banyak gambar, selalu ada pendekatan brute-force:
for i in $(docker images -q)
do
docker history $i | grep -q f50f9524513f && echo $i
done | sort -u
Instal dockviz dan ikuti cabang dari id gambar di tampilan hierarki:
go get github.com/justone/dockviz
$(go env GOPATH)/bin/dockviz images --tree -l
Jawaban singkat: Ini adalah skrip python3 yang mencantumkan gambar buruh pelabuhan yang bergantung.
Jawaban panjang: Anda dapat melihat id gambar dan id induk untuk semua gambar yang dibuat setelah gambar yang dimaksud dengan yang berikut:
docker inspect --format='{{.Id}} {{.Parent}}' \
$(docker images --filter since=f50f9524513f --quiet)
Anda seharusnya dapat mencari gambar dengan id induk yang dimulai dengan f50f9524513f, lalu mencari gambar anak dari itu , dll.. Tapi .Parent
tidak seperti yang Anda pikirkan., jadi biasanya Anda perlu menentukan docker images --all
di atas untuk membuatnya berfungsi, maka Anda juga akan mendapatkan id gambar untuk semua lapisan perantara.
Berikut skrip python3 yang lebih terbatas untuk mem-parsing keluaran buruh pelabuhan dan melakukan pencarian untuk menghasilkan daftar gambar:
#!/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))))
Jika Anda menyimpan ini sebagai desc.py
Anda dapat memintanya sebagai berikut:
docker images \
| fgrep -f <(docker inspect --format='{{.Id}} {{.Parent}}' \
$(docker images --all --quiet) \
| python3 desc.py f50f9524513f )
Atau cukup gunakan intisari di atas, yang melakukan hal yang sama.
Saya telah membuat intisari dengan skrip Shell untuk mencetak pohon turunan dari gambar buruh pelabuhan, jika ada yang tertarik dengan solusi 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" ""