কীভাবে ডকারে নির্ভরশীল শিশু চিত্রগুলির তালিকা পাবেন?


123

আমি একটি চিত্র অপসারণ করার চেষ্টা করছি এবং আমি পেয়েছি:

# 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

এটি ডকার সংস্করণ:

# 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

তবে অতিরিক্ত কোনও তথ্য নেই:

# 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

এটি নির্ভর করে এমন শিশু চিত্রগুলি কীভাবে পাব ?

সেই চিত্র আইডির সাথে কোনও চলমান বা থামানো ধারক নেই।


9
আমাকে ভাবতে হবে যে ডকার দল কেন এটির জন্য কোনও দেশীয় উপায় সরবরাহ করতে পারে না?
অমলগোভিনাস

উত্তর:


54

সংক্ষিপ্ত উত্তর: এখানে একটি পাইথন 3 স্ক্রিপ্ট রয়েছে যা নির্ভরশীল ডকার চিত্রগুলি তালিকাভুক্ত করে।

দীর্ঘ উত্তর: আপনি নীচের প্রশ্নে ইমেজ পরে তৈরি সমস্ত চিত্রের জন্য চিত্র আইডি এবং পিতামাতার আইডি দেখতে পারেন:

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

আপনি f50f9524513f দিয়ে শুরু পিতা বা মাতা আইডি সহ ইমেজ জন্য দেখুন, তারপর সন্তান ইমেজ জন্য চেহারা সক্ষম হওয়া উচিত সেই , ইত্যাদি .. কিন্তু .Parent আপনি কি মনে করেন না। , সুতরাং বেশিরভাগ ক্ষেত্রে আপনাকে docker images --allসেই কাজটি করার জন্য উপরে নির্দিষ্ট করতে হবে, তারপরে আপনি সমস্ত মধ্যবর্তী স্তরগুলির জন্য চিত্র আইডিরও পাবেন।

ডকার আউটপুট পার্স করার জন্য এবং চিত্রগুলির তালিকা উত্পন্ন করতে অনুসন্ধান করার জন্য এখানে একটি আরও সীমিত পাইথন 3 স্ক্রিপ্ট রয়েছে:

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

আপনি যদি এটি সংরক্ষণ করে থাকেন তবে আপনি desc.pyনীচের মত এটি আহবান করতে পারেন:

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

বা কেবল উপরের টুকরোটি ব্যবহার করুন যা একই কাজ করে।


2
তাদের মধ্যে কেউ যদি প্রত্যাশিত চরিত্রগুলি দিয়ে শুরু না করেন? এটি কি কোনও সম্ভাব্য ত্রুটি নির্দেশ করে? আমি ম্যাক বিটা, এফডব্লিউআইডাব্লির হয়ে ডকারে আছি, যাতে তা আমাকে অবাক করে না।
নেফফক্স 21

হয় এটি কোনও বাগ, বা এর অর্থ এই যে চিত্রটির কোনও প্রশ্ন নেই question
আরেহ লাইব বৃষ

2
এটি সত্যই আসল প্রশ্নের উত্তর দেয় না। এটি দেখায় যে প্রশ্নে ইমেজের পরে কী তৈরি হয়েছিল, যা পোস্টার মোছার চেষ্টা করছে এমন চিত্রের উপর নির্ভর করতে পারে বা নাও হতে পারে। সাইমন ব্র্যাডি এর উত্তরটি কৌশলটি কমপক্ষে ছোট ছোট নমুনা আকারের চিত্রের জন্য করে।
পেঙ্গুইকোডার

2
@penguincoder অজগর স্ক্রিপ্ট এর জন্য এটি।
আরেহ লাইব বৃষ

@ নেভারফক্সের মতো, এই উত্তরটি আমার পক্ষে কার্যকর হয়নি। যদিও নীচে সাইমন ব্র্যাডি এর উত্তর কাজ করেছে।
চিহ্নিত করুন

91

যদি আপনার কাছে বিশাল সংখ্যক চিত্র না থাকে তবে সর্বদা নিষ্ঠুর-জোরের পদ্ধতির উপস্থিতি রয়েছে:

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

1
আমি মনে করি এটিই "সেরা" সমাধান। আপনি এটিকে কিছুটা প্রসারিত করতে পারেন এবং কিছুটা আরও পরিষ্কার করে দিতে পারেন কী কী পরিবর্তন করে echo $1(তবে এখনও হিংস্র-জোর করে) docker images | grep $i( --filterচিত্র আইডির জন্য পতাকা ব্যবহারের চেয়ে ডকার সংস্করণে আরও বহনযোগ্য )
জন ভি

15

ডকভিজ ইনস্টল করুন এবং গাছের ভিউতে চিত্র আইডি থেকে শাখাগুলি অনুসরণ করুন:

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

sudo apt-get update ; sudo apt-get install golang-go; export GOPATH=$HOME/.goপ্রথমে করাই ভাল ।
loretoparisi

3
ম্যাকোএস-এর মাধ্যমে পাওয়া যায়brew install dockviz
rcoup

সাবধান, উবুন্টু ব্যবহার করার সময়। এটি সাধারণত যাওয়ার জন্য পুরানো
সংগ্রহগুলি

7

ডকার ইমেজের বংশধর গাছ প্রিন্ট করার জন্য আমি শেল স্ক্রিপ্ট সহ একটি গিস্ট তৈরি করেছি , কেউ যদি বাশ সমাধানে আগ্রহী হন:

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

যদিও এই লিঙ্কটি প্রশ্নের উত্তর দিতে পারে, উত্তরের প্রয়োজনীয় অংশগুলি এখানে অন্তর্ভুক্ত করা এবং রেফারেন্সের জন্য লিঙ্কটি সরবরাহ করা ভাল। লিঙ্কযুক্ত পৃষ্ঠাগুলি পরিবর্তিত হলে লিঙ্ক-শুধুমাত্র উত্তরগুলি অবৈধ হতে পারে। - পর্যালোচনা থেকে
জুয়ান ক্রুজ সোলার

আমাকে কেবল কোডটি ফর্ম্যাট করতে সমস্যা হয়েছিল, তাই আমি ছেড়ে দিয়েছি, এই জানুয়ারী করার জন্য ধন্যবাদ
মিশাল লিনহার্ড

2

আমার চূড়ান্ত "চিত্র" সংরক্ষণের জন্য আমি এটিই করেছি (স্তরটি, সত্যিই - যা আমাকে ফেলে দিয়েছে, কারণ আমি সবেমাত্র ডকার তৈরিতে যাচ্ছি)।

আমি পুরোটা পেয়ে যাচ্ছিলাম "... জোর করা যায় না ..." বার্তা। আমি বুঝতে পেরেছিলাম যে আমার যে চিত্রগুলি প্রয়োজন তা আমি মুছতে পারি না কারণ তারা 'ডকার কমিট' দ্বারা নির্মিত সত্যিকারের স্বাধীন চিত্র নয়। আমার সমস্যাটি ছিল, বেস ইমেজ এবং আমার ফাইনালের মধ্যে আমার বেশ কয়েকটি চিত্র (বা স্তর) ছিল এবং আমি পরিষ্কার করার চেষ্টা করছি যেখানে আমি শিশু এবং পিতামাতার সম্পর্কে ত্রুটি / সতর্কতার সাথে মিলিত হয়েছিল।

  1. আমি চূড়ান্ত চিত্রটি (বা স্তরটি, যদি আপনি চান) একটি টারবলে রফতানি করে।
  2. তারপরে আমি আমার চূড়ান্ত চিত্র সহ সমস্ত চিত্র মুছে ফেললাম - আমি এটি একটি টারবলে সংরক্ষণ করেছি, যদিও আমি নিশ্চিত ছিলাম না যে আমি এটি ব্যবহার করতে সক্ষম হব, আমি কেবল পরীক্ষামূলক ছিলাম।
  3. আমি তখন দৌড়ে গেলাম docker image load -i FinalImage.tar.gz। আউটপুটটি এমন কিছু ছিল:

7d9b54235881: Loading layer [==================================================>]  167.1MB/167.1MB
c044b7095786: Loading layer [==================================================>]  20.89MB/20.89MB
fe94dbd0255e: Loading layer [==================================================>]  42.05MB/42.05MB
19abaa1dc0d4: Loading layer [==================================================>]  37.96MB/37.96MB
4865d7b6fdb2: Loading layer [==================================================>]  169.6MB/169.6MB
a0c115c7b87c: Loading layer [==================================================>]    132MB/132MB

লোড করা চিত্র আইডি: sha256: 82d4f8ef9ea1eab72d989455728762ed3c0fe35fd85acf9edc47b41dacfd6382

এখন, আমি যখন 'ডকার ইমেজ এলএস' দিয়ে তালিকাবদ্ধ করি তখন আমার কাছে কেবলমাত্র মূল বেস চিত্র এবং চূড়ান্ত চিত্রটি আগে আমি একটি টারবলে সংরক্ষণ করি all

[root@docker1 ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               import              82d4f8ef9ea1        3 days ago          747MB
centos              httpd               36540f359ca3        5 weeks ago         193MB

আমার সিস্টেম এখন 'পরিষ্কার'। আমার কেবল ইমেজগুলি রয়েছে। এমনকি আমি কোনও সমস্যা ছাড়াই বেস চিত্রটি মুছে ফেলেছি।

[root@docker1 ~]# docker rmi 36540f359ca3
Untagged: centos:httpd
Untagged:     centos@sha256:c1010e2fe2b635822d99a096b1f4184becf5d1c98707cbccae00be663a9b9131
Deleted: sha256:36540f359ca3b021d4b6a37815e9177b6c2bb3817598979ea55aee7ecc5c2c1f

উত্তম উত্তর, তবে লোড কেবলমাত্র "ডকার সেভ" থেকে তৈরি করা কোনও চিত্রের জন্য ব্যবহৃত হবে বলে মনে করা হচ্ছে। "ডকার রফতানির" জন্য যথাযথ পুনরুদ্ধার হ'ল "ডকার আমদানি"
অমলগোভিনাস

2

স্লসি এবং মাইকেল হফম্যান উত্তরের ভিত্তিতে , আপনার যদি এক টন চিত্র না থাকে তবে আপনি এই শেল ফাংশনটি ব্যবহার করতে পারেন:

docker_image_desc() {
  for image in $(docker images --quiet --filter "since=${1}"); do
    if [ $(docker history --quiet ${image} | grep ${1}) ]; then
      docker_image_desc "${image}"
    fi
  done
  echo "${1}"
}

এবং তারপরে এটি কল করুন

docker_image_desc <image-id> | awk '!x[$0]++'

2

পাইথন এপিআই এর উপর ভিত্তি করে একটি সমাধান এখানে দেওয়া হয়েছে pip install dockerযা বংশধরদের তাদের ট্যাগগুলির সাথে একত্রে তালিকাবদ্ধ করে (যদি থাকে), সম্পর্কের গভীরতা (বাচ্চা, নাতি-নাতনী ইত্যাদি) অনুসারে ইনডেন্টেশন বাড়িয়ে তোলে:

import argparse
import docker

def find_img(img_idx, id):
    try:
        return img_idx[id]
    except KeyError:
        for k, v in img_idx.items():
            if k.rsplit(":", 1)[-1].startswith(id):
                return v
    raise RuntimeError("No image with ID: %s" % id)

def get_children(img_idx):
    rval = {}
    for img in img_idx.values():
        p_id = img.attrs["Parent"]
        rval.setdefault(p_id, set()).add(img.id)
    return rval

def print_descendants(img_idx, children_map, img_id, indent=0):
    children_ids = children_map.get(img_id, [])
    for id in children_ids:
        child = img_idx[id]
        print(" " * indent, id, child.tags)
        print_descendants(img_idx, children_map, id, indent=indent+2)

def main(args):
    client = docker.from_env()
    img_idx = {_.id: _ for _ in client.images.list(all=True)}
    img = find_img(img_idx, args.id)
    children_map = get_children(img_idx)
    print_descendants(img_idx, children_map, img.id)

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("id", metavar="IMAGE_ID")
    main(parser.parse_args())

উদাহরণ:

$ python find_dep_img.py 549afbf12931
 sha256:913d0981fdc7d2d673f2c8135b7afd32ba5037755e89b00432d3460422ba99b9 []
   sha256:0748dbc043b96ef9f88265c422e0267807f542e364b7a7fadf371ba5ee082b5d []
     sha256:6669414d2a0cc31b241a1fbb00c0ca00fa4dc4fa65dffb532bac90d3943d6a0a []
       sha256:a6441e7d9e92511608aad631f9abe8627033de41305c2edf7e03ee36f94f0817 ['foo/bar:latest']

আমি এটি https://gist.github.com/simleo/10ad923f9d8a2fa410f7ec2d7e96ad57 এ সংক্ষিপ্তসার হিসাবে উপলব্ধ করেছি


1

পিতামাতার চিত্রের উপর নির্ভরশীল শিশুদের চিত্রের তালিকা পাওয়ার জন্য এখানে একটি সহজ উপায়:

image_id=123456789012

docker images -a -q --filter since=$image_id |
xargs docker inspect --format='{{.Id}} {{.Parent}}' |
grep $image_id

এটি শিশু / পিতামাতার চিত্রগুলির আইডিগুলির একটি তালিকা তৈরি করবে, উদাহরণস্বরূপ (ব্রেভিটির জন্য ছাঁটা):

sha256:abcdefghijkl sha256:123456789012

বাম দিকটি হ'ল চাইল্ড ইমেজ আইডি, ডান দিকটি প্যারেন্ট ইমেজ আইডি যা আমরা মুছে ফেলার চেষ্টা করছি, কিন্তু এটি বলছে "চিত্রটি নির্ভর করে শিশু চিত্রগুলি"। এটি আমাদের জানায় যে abcdefghijklসেই সন্তানের উপর নির্ভরশীল 123456789012। সুতরাং আমাদের প্রথমে দরকার docker rmi abcdefghijkl, তারপরে আপনি পারেনdocker rmi 123456789012

এখন, নির্ভরশীল শিশুদের চিত্রগুলির একটি শৃঙ্খলা থাকতে পারে, তাই আপনাকে শেষ শিশুটি খুঁজতে বার বার পুনরুক্তি করতে হতে পারে।


0

আপনি ডকারের নীচের ডিরেক্টরিটির মাধ্যমে পিতামাতা ও সন্তানের সম্পর্ক নির্বিশেষে ডকার চিত্রগুলি মুছতে পারেন

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

এই ডিরেক্টরিতে আপনি ডকার চিত্রগুলি পেতে পারেন, তাই আপনি যা চান তা মুছতে পারেন।


আমি ডকার এপিআই ব্যবহার করে পোর্টেবল কমান্ডগুলি তৈরির চেষ্টা করছি, ডিভাইস ম্যাপার এবং ডকার ইঞ্জিন ধরে রেখে (উদাহরণস্বরূপ ডকার সোকার বিপরীতে) এটিকে একটি বহনযোগ্য সমাধান হিসাবে তৈরি করে। ফাইল সিস্টেমে ফাইলগুলি মুছে ফেলা ঝুঁকিপূর্ণ যখন অন্য প্রক্রিয়া (ডকার ডেমন সহ) এটি ব্যবহার করতে পারে।
নিকোসেসার

এটা ম্যাকোসে কোথায়?
অ্যান্টনি কং

1
* সতর্কবাণী "এই করতে মোছা এবং ভবিষ্যতে পাত্রে কাছে সঙ্গে একাধিক ত্রুটি কখনও ডিলিট dirs মধ্যে হতে পারে। /var/lib/dockerসরাসরি হাতে
vladkras

0

কেমন:

ID=$(docker inspect --format="{{.Id}}" "$1")
IMAGES=$(docker inspect --format="{{if eq \"$ID\" .Config.Image}}{{.Id}}{{end}}" $(docker images --filter since="$ID" -q))
echo $(printf "%s\n" "${IMAGES[@]}" | sort -u)

এটি sha256:উপসর্গ সহ শিশু চিত্রের আইডি মুদ্রণ করবে ।
আমারও নিম্নলিখিতগুলি ছিল, যা নামগুলি সংযোজন করে:

IMAGES=$(docker inspect --format="{{if eq \"$ID\" .Config.Image}}{{.Id}}{{.RepoTags}}{{end}}" $(docker images --filter since="$ID" -q))

  • ID= চিত্রটির পুরো আইডি পায়
  • IMAGES= সমস্ত শিশু চিত্র পায় যা এই চিত্রটিকে একটি হিসাবে তালিকাভুক্ত করা হয়েছে Image
  • echo... সদৃশগুলি সরিয়ে দেয় এবং ফলাফলগুলি প্রতিধ্বনিত করে

আমি গো ফর্ম্যাট শর্তাদি পছন্দ করি তবে এই ব্যবহারের ক্ষেত্রে ফিল্টার হিসাবে তারা আরও ভাল।

0

আমি বাচ্চাদের, তাদের রেপো ট্যাগগুলি পুনরাবৃত্তভাবে খুঁজে পেতে এবং তারা কী করছে তা মুদ্রণ করতে এটি রান্না করেছি:

docker_img_tree() {
    for i in $(docker image ls -qa) ; do
        [ -f "/tmp/dii-$i"  ] || ( docker image inspect $i > /tmp/dii-$i)
        if grep -qiE 'Parent.*'$1 /tmp/dii-$i ; then
            echo "$2============= $i (par=$1)"
            awk '/(Cmd|Repo).*\[/,/\]/' /tmp/dii-$i | sed "s/^/$2/"
            docker_img_tree $i $2===
        fi
    done
}

আপনার হোস্ট সুরক্ষিত না থাকলে / tmp / dii- * মুছে ফেলতে ভুলবেন না।


-6

আমিও একই সমস্যার মুখোমুখি ছিলাম। সমস্যাটি সমাধানের জন্য নীচে পদক্ষেপগুলি বাতিল।

সমস্ত চলমান পাত্রগুলি বন্ধ করুন

ডকার স্টপ $ (ডকার পিএস -এক) সমস্ত পাত্রে সরান

ডকার আরএম $ (ডকার পিএস -এক) সমস্ত চিত্র সরান

ডকার আরএমআই $ (ডকার ইমেজ-কি)


এই উত্তরটি প্রশ্নকর্তার প্রয়োজনীয়তা পূরণ করে না।
অঙ্কুর লরিয়া

লোকেরা সম্ভাব্যভাবে অনুলিপি এবং পেস্ট করতে এবং ক্ষতিকারক জিনিসগুলি করতে পারে এমন মন্তব্য করা বন্ধ করুন।
নিকোসসার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.