GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara mendapatkan daftar gambar anak tanggungan di Docker?

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" ""

Linux
  1. Bagaimana Cara Mendapatkan Versi Terbaru Winetricks Di Ubuntu?

  2. Cara Memodifikasi Gambar Docker

  3. Cara Mendaftar Kontainer Docker

  1. Cara Mendaftar Ketergantungan Paket Di Linux

  2. Bagaimana cara mendapatkan daftar direktori dalam zip?

  3. bagaimana cara mendapatkan daftar klien wifi yang terhubung di OpenWrt 10.03?

  1. Cara Mencari, Menarik, Mendaftar &Menghapus Gambar Docker di Linux

  2. Bagaimana Cara Mendapatkan Versi Ksh dengan Aman?

  3. Bagaimana saya bisa mendapatkan informasi wadah Docker Linux dari dalam wadah itu sendiri?