आश्रित बाल छवियों के साथ docker छवि को नहीं हटाया जा सकता है


164

मैं कोशिश कर रहा हूँ

docker rmi c565603bc87f

त्रुटि:

डेमन से त्रुटि प्रतिक्रिया: संघर्ष: c565603bc87f को हटाने में असमर्थ (मजबूर नहीं किया जा सकता है) - छवि में बच्चे की छवियों पर निर्भर है

इसलिए मैं झंडे के साथ भी छवि को हटा नहीं सकता। तब और उसके सभी बच्चों की छवि को कैसे हटाया जाए?

लिनक्स और डॉक वर्जन:

uname -a Linux goracio-pc 4.4.0-24-generic # 43-Ubuntu SMP Wed Jun 8 19:27:37 UTC 2016 x86_64 x86_64 x86_64 GNU / Linux

docker संस्करण क्लाइंट: संस्करण: 1.11.2 API संस्करण: 1.23 जाओ संस्करण: go1.5.4 Git कमिट: b9f10c9 बिल्ट: बुध Jun 1 22:00:43 2016 OS / Arch: linux / amd64

सर्वर: संस्करण: १.११.२ एपीआई संस्करण: १.२३ गो संस्करण: go1.5.4 Git कमिट: b9f10c9 बिल्ट: बुध जून 1 22:00:43 2016 OS / Arch: linux / amd64



2
नवीनतम से सबसे पुराने तक टैग द्वारा हटाएं। यदि वे एक रेपो में रहते हैं, तो उन्हें खींच लिया जाएगा यदि किसी डॉकफेरील को उनकी आवश्यकता होती है।
राफेलबैटस्टी

आपने (बहुत अच्छा) उत्तर गुयेन द्वारा प्रदान किया गया स्वीकार किया
jpw

जवाबों:


119

आपको छवि को हटाने से पहले अनावश्यक छवियों को हटाने की कोशिश करनी चाहिए:

docker rmi $(docker images --filter "dangling=true" -q --no-trunc)

उसके बाद, रन:

docker rmi c565603bc87f

13
कोई झूलने वाली छवियां नहीं हैं ... docker छवियाँ -f लटकना = सत्य -> ​​कुछ भी नहीं
रोमन

39
यह उत्तर एक अलग प्रश्न का उत्तर दे रहा है "मैं झूलने वाली छवियां कैसे निकालूं?" ओपी का सवाल है "मैं आश्रित चित्र कैसे निकालूं?"
tu-Reinstate Monica-dor duh

6
छवियों झूलते निकालने के लिए, बस का उपयोगprune
Deqing

17
यह आदेश अब काम नहीं करता है:> "docker rmi" requires at least 1 argument.
samayo

2
@samayo अगर आपको लगता है कि त्रुटि मिलती है, करने के लिए फिल्टर हिस्सा बदलने का प्रयास करें: --filter=dangling=true। यदि आप अभी भी उस त्रुटि को प्राप्त करते हैं, तो इसका मतलब है कि आपके पास कोई झूलने वाली छवियां नहीं हैं, और इसलिए कि इन-सेट कमांड एक खाली स्ट्रिंग का मूल्यांकन करता है।
HammerN'Songs

100

कुछ मामलों में (जैसे मेरे मामले में) आप उस छवि आईडी को निर्दिष्ट करके एक छवि को हटाने की कोशिश कर सकते हैं जिसमें कई टैग हैं जिनका आपको एहसास नहीं है, जिनमें से कुछ का उपयोग अन्य छवियों द्वारा किया जा सकता है। किस स्थिति में, आप छवि को हटाना नहीं चाहेंगे

यदि आपके पास यहां वर्णित अनावश्यक टैग्स का मामला है, तो आपके द्वारा हटाए जाने वाले अनावश्यक टैग पर docker rmi <image_id>उपयोग के बजाय docker rmi <repo:tag>


11
docker rmi <repo:tag>मेरे लिए काम किया। आपका समाधान उन उत्तरों के बीच काफी सरल है, धन्यवाद।
शिह झांग

यह मेरे पुराने दूरस्थ golang छवियों के लिए मेरे मामले के लिए ऐसा करने का सबसे अच्छा तरीका होना चाहिए
मंदिर

यह मेरे लिए टिकट था, धन्यवाद। Untagged: drud/ddev-webserver:20200301_leymannx_apache-junk-built
rfay

अगर किसी ने Microsoft के eShopOnContainers नमूने स्थापित किए हैं तो आपको पूरी तरह से हर एक को इस तरह से निकालना होगा repo:tagक्योंकि यह केवल दो छवि आईडी साझा करने वाली आठ टैग की गई छवियां बनाता है। यहां तक ​​कि विजुअल स्टूडियो उन्हें अपने कंटेनर प्रबंधन विंडो में नहीं
हटाएगा

कमांड docker rmi <repo:tag>केवल अनटैग करता है, जरूरी नहीं कि यह किसी इमेज को डिलीट करे। यदि इस चित्र को संदर्भित करने वाले एक से अधिक टैग हैं, या यदि कोई अन्य समस्या है, जैसे कि ओपी द्वारा कहा गया है, तो छवि अभी भी रहेगी। आप जांच सकते हैं कि छवि अभी भी कमांड के साथ मौजूद है docker images ls --all
ट्वैन 163

50

पिछले सभी उत्तर सही हैं लेकिन यहां एक समाधान है जो आपकी सभी छवियों को बलपूर्वक हटा रहा है ( इस आदेश का उपयोग अपने जोखिम पर करें यह आपकी सभी छवियों को हटा देगा )

docker rmi $(docker images -q) -f

यहां छवि विवरण दर्ज करें


1
यह मेरे लिए काम किया; मैं सिर्फ अपनी सभी स्थानीय छवियों को उड़ाना चाहता था। ध्यान दें, मुझे अपने डॉक वर्जन (18.09.7) के साथ काम करने के लिए अपडेट करना था: docker image rm $(docker image ls -a -q) -f
akagixxer

40

निम्नलिखित के साथ प्रश्न में छवि के बाद बनाई गई सभी छवि के लिए छवि आईडी और मूल आईडी खोजें:

docker inspect --format='{{.Id}} {{.Parent}}' $(docker images --filter since=<image_id> -q)

फिर आप कमांड को कॉल करें:

docker rmi {sub_image_id} 

"sub_image_id" निर्भर छवि की आईडी है


एक विशिष्ट छवि के मध्यवर्ती चित्रों को हटाने के लिए अच्छा है। धन्यवाद!!
A.Villegas

अज्ञात ध्वज --filter: /
समुराईजैक

यह प्रश्न का वास्तविक समाधान प्रतीत होता है!
पाओलो

28

मेरे लिए जो काम किया गया था, उसका उपयोग करें: IMAG ID के बजाय TAG संयोजन।

जब मैंने docker rmi <IMAGE ID>इस छवि से संबंधित कोई कंटेनर नहीं के साथ कमांड के साथ एक डॉक छवि को हटाने की कोशिश की, जिसमें मेरा संदेश था:

$ docker rmi 3f66bec2c6bf
Error response from daemon: conflict: unable to delete 3f66bec2c6bf (cannot be forced) - image has dependent child images

जब मैंने कमांड का उपयोग किया तो मैं सफलता के साथ हटा सकता था docker rmi RPOSITORY:TAG

$ docker rmi ubuntu:18.04v1
Untagged: ubuntu:18.04v1

वास्तव में। किसी भी स्पष्टीकरण क्यों इस अजीब व्यवहार?
रॉड्रिगो 28

1
यह मेरे लिए भी काम किया। मेरे मामले में मेरे पास उबंटू छवि थी, इसे माता-पिता के रूप में किसी अन्य छवि में संदर्भित नहीं किया गया था, लेकिन फिर भी इसे हटाने में असमर्थ था। docker rmi 93fd78260bd1असफल रहा, लेकिन फिर docker tag 93fd78260bd1 ubuntu:temp && docker rmi ubuntu:tempसफल रहा।
थॉमस लोब्कर

मेरे लिए काम, आउट ऑफ़ डेट इमेज भी अपडेट कर रहा था। किसी को पता है कि यह क्यों आईडी आईडी विफल रहता है?
स्ट्राइड

3
यह वास्तव में छवि को नष्ट नहीं करता है। यह सिर्फ उस छवि के लिए एक डुप्लिकेट टैग निकालता है (इसलिए संदेश Untagged: ubuntu:18.04v1)। यदि आप करते हैं docker images -a, तो आप शायद 3f66bec2c6bfअभी भी सूचीबद्ध देखेंगे । यदि छवि को वास्तव में हटा दिया गया था, तो आपको संदेश मिलेगाDeleted: 3f66bec2c6bf
बुद्धिमान

17

यह कमिट सभी वस्तुओं का उपयोग करता है (उपयोग के साथ उपयोग)

क्या आपने उपयोग करने का प्रयास किया है - प्रवर्तन

sudo docker rmi $(sudo docker images -aq) --force

यह उपरोक्त कोड एक आकर्षण की तरह चलता है यहां तक ​​कि एक ही मुद्दा था


1
मैंने
सूडो

7

इसका उत्तर यहाँ पर आने वाले सभी बच्चों को ढूंढना है, जिनका यहाँ उत्तर है:

docker मैं आश्रित बाल चित्रों की सूची कैसे प्राप्त कर सकता हूँ?

फिर क्रम में बच्चे की छवियों को हटाने के लिए इसका उपयोग करें।


9
क्या आपने अभी तक इस स्क्रिप्ट को निकाल दिया है?
टीटी।

1
मैंने आगे बढ़कर अपनी स्क्रिप्ट में नीचे fleshed किया।
सीमित प्रायश्चित

6

यहाँ एक छवि को निकालने के लिए एक स्क्रिप्ट और उस पर निर्भर सभी चित्र हैं।

#!/bin/bash

if [[ $# -lt 1 ]]; then
    echo must supply image to remove;
    exit 1;
fi;

get_image_children ()
{
    ret=()
    for i in $(docker image ls -a --no-trunc -q); do
        #>&2 echo processing image "$i";
        #>&2 echo parent is $(docker image inspect --format '{{.Parent}}' "$i")
        if [[ "$(docker image inspect --format '{{.Parent}}' "$i")" == "$1" ]]; then
            ret+=("$i");
        fi;
    done;
    echo "${ret[@]}";
}

realid=$(docker image inspect --format '{{.Id}}' "$1")
if [[ -z "$realid" ]]; then
    echo "$1 is not a valid image.";
    exit 2;
fi;
images_to_remove=("$realid");
images_to_process=("$realid");
while [[ "${#images_to_process[@]}" -gt 0 ]]; do
    children_to_process=();
    for i in "${!images_to_process[@]}"; do
        children=$(get_image_children "${images_to_process[$i]}");
        if [[ ! -z "$children" ]]; then
            # allow word splitting on the children.
            children_to_process+=($children);
        fi;
    done;
    if [[ "${#children_to_process[@]}" -gt 0 ]]; then
        images_to_process=("${children_to_process[@]}");
        images_to_remove+=("${children_to_process[@]}");
    else
        #no images have any children. We're done creating the graph.
        break;
    fi;
done;
echo images_to_remove = "$(printf %s\n "${images_to_remove[@]}")";
indices=(${!images_to_remove[@]});
for ((i="${#indices[@]}" - 1; i >= 0; --i)) ; do
    image_to_remove="${images_to_remove[indices[i]]}"
    if [[ "${image_to_remove:0:7}" == "sha256:" ]]; then
        image_to_remove="${image_to_remove:7}";
    fi
    echo removing image "$image_to_remove";
    docker rmi "$image_to_remove";
done

6
# docker rm $(docker ps -aq)

उसके बाद कमांड का उपयोग करें जैसा कि नुग्येन ने सुझाव दिया था।


4

साइमन ब्रैडी के जानवर बल विधि पर बिल्डिंग यहाँ , अगर आप आप इस खोल समारोह का उपयोग कर सकते छवियों की एक टन की जरूरत नहीं है:

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

और फिर इसका उपयोग करके कॉल करें recursive_remove_image <image-id>


4
docker rmi <rep:tag>

उदाहरण के लिए:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python              3.6            60f85556d5d2        4 days ago          174MB

डोकर रमी अजगर: 3.6


3

जब मैं "<none>"डॉक में नाम के साथ कुछ अप्रयुक्त छवि को हटाना चाहता हूं, तो मैं unable to delete a354bbc7c9b7 (cannot be forced) - image has dependent child imagesइस समस्या को हल कर सकता हूं :

सुडो डोकर पीएसए -ए

CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                         PORTS                                              NAMES
01ee1276bbe0        lizard:1                    "/bin/sh -c 'java ..."   About an hour ago   Exited (1) About an hour ago                                                      objective_lewin
49d73d8fb023        javaapp:latest              "/usr/bin/java -ja..."   19 hours ago        Up 19 hours                    0.0.0.0:8091->8091/tcp                             pedantic_bell
405fd452c788        javaapp:latest              "/usr/bin/java -ja..."   19 hours ago        Created                                                                           infallible_varahamihira
532257a8b705        javaapp:latest              "/usr/bin/java -ja..."   19 hours ago        Created                                                                           demo-default
9807158b3fd5        javaapp:latest              "/usr/bin/java -ja..."   19 hours ago        Created                                                                           xenodochial_kilby
474930241afa        jenkins                     "/bin/tini -- /usr..."   13 days ago         Up 4 days                      0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp   myjenkins
563d8c34682f        mysql/mysql-server:latest   "/entrypoint.sh my..."   3 weeks ago         Up 4 days (healthy)            0.0.0.0:3306->3306/tcp, 33060/tcp                  mymysql
b4ca73d45d20        phpmyadmin/phpmyadmin       "/run.sh phpmyadmin"     4 weeks ago         Exited (0) 3 weeks ago                                                            phpmyadmin

आप देख सकते हैं कि मेरे पास javaapp नाम की कई छवियां हैं: नवीनतम और अलग कंटेनर नाम। तो, मैंने "जावाप: नवीनतम" कंटेनर के सभी कंटेनर को मार डाला और हटा दिया:

सुडोकू बंद करो "कंटेनरनाम"

सूदो डोकर आरएम "कंट्रनाम"

फिर

सुदो डोकर रमी -फ "इमेजआईड"

इसलिए मैं नाम के साथ सभी छवियों को हटा सकता हूं "<none>"

सौभाग्य


1

मुझे यह मुद्दा भी मिला, मैं नीचे दिए गए आदेशों के साथ समस्या को हल कर सकता हूं। यह कारण हो सकता है, छवि का कंटेनर चल रहा है या बाहर निकल रहा है इसलिए छवि को हटाने से पहले आपको कंटेनर को निकालने की आवश्यकता है

docker ps -a -f status = exited: यह कमांड सभी बाहर निकले कंटेनरों को दिखाता है, फिर कंटेनर Id की प्रतिलिपि बनाएँ और फिर कंटेनर देने के लिए नीचे चलाएं

docker rm #containerId: यह कमांड कंटेनर इस समस्या को दूर करता है जो उल्लेख करता है कि "छवि में आश्रित बाल चित्र हैं"

फिर नीचे कमांड के साथ छवि को हटाने का प्रयास करें

docker rmi #ImageId


1

मेरे पास यह मुद्दा था और यहां दिए गए संक्षिप्त उत्तरों में से कोई भी काम नहीं किया, यहां तक ​​कि @tudor द्वारा ऊपर वर्णित पृष्ठ में भी। मुझे लगा कि मैं यहां साझा करूंगा कि मुझे छवियों से कैसे छुटकारा मिला। मैं इस विचार के साथ आया था कि आश्रित छवियां होनी चाहिए> = मूल छवि का आकार, जो इसे पहचानने में मदद करता है ताकि हम इसे हटा सकें।

मैंने आकार क्रम में छवियों को यह देखने के लिए सूचीबद्ध किया कि क्या मैं किसी भी सहसंबंध को देख सकता हूं:

docker images --format '{{.Size}}\t{{.Repository}}\t{{.Tag}}\t{{.ID}}' | sort -h -r | column -t

यह क्या करता है, छवि आकार स्तंभ को पहले स्थान देने के लिए डॉकटर से कुछ विशेष प्रारूपण का उपयोग करें, फिर रिवर्स ऑर्डर में एक मानव पठनीय सॉर्ट चलाएं। फिर मैं आसानी से पढ़े जाने वाले कॉलमों को पुनर्स्थापित करता हूं।

फिर मैंने <none>कंटेनरों को देखा , और सूची में पहले एक समान आकार के साथ मिलान किया। मैंने docker rmi <image:tag>उस छवि पर एक सरल प्रदर्शन किया और सभी <none>बच्चे चित्र उसके साथ चले गए।

सभी बाल छवियों के साथ समस्या की छवि वास्तव में मेरे द्वारा उपयोग की गई लानत myrepo/getstarted-lab छवि थी जब मैंने पहली बार डॉकटर के साथ खेलना शुरू किया था। ऐसा इसलिए था क्योंकि मैंने पहली परीक्षण छवि से एक नई छवि बनाई थी जिसने श्रृंखला बनाई।

उम्मीद है कि किसी बिंदु पर किसी और की मदद करता है।


1

मान लीजिए कि हमारे पास डॉकरीफाइल है

FROM ubuntu:trusty
CMD ping localhost

हम TAG या नामकरण के बिना उससे छवि बनाते हैं

docker build .

अब हमारे पास एक सफलता रिपोर्ट है "सफलतापूर्वक निर्मित 57ca5ce94d04" यदि हम docker की छवियाँ देखते हैं

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              57ca5ce94d04        18 seconds ago      188MB
ubuntu              trusty              8789038981bc        11 days ago         188MB

हमें पहले हटाने की जरूरत है docker rmi 57ca5ce94d04

के बाद

docker rmi 8789038981bc

उस छवि को हटा दिया जाएगा!

किसी के द्वारा सुझाए गए अनुसार सभी को हटाने के लिए मजबूर करना

docker rmi $(docker images -q) -f

1

@ गुयेन द्वारा प्रदान किए गए उत्तर पर विस्तार करते हुए - इस फ़ंक्शन को आपके .bashrcआदि में जोड़ा जा सकता है और फिर किसी भी सफाई में मदद करने के लिए कमांडलाइन से कॉल किया जा सकता हैimage has dependent child images त्रुटि ...

आप फ़ंक्शन को स्वयं के रूप में चला सकते हैं, और यदि docker psविफल रहता है, तो यह आपके पासवर्ड के लिए dockerकमांड चलाएगा sudoऔर आपको संकेत देगा।

किसी भी चल रहे कंटेनर के लिए छवियों को हटा नहीं है !

docker_rmi_dependants ()                                                                                                                                                         
{ 
  DOCKER=docker
  [ docker ps >/dev/null 2>&1 ] || DOCKER="sudo docker"

  echo "Docker: ${DOCKER}"

  for n in $(${DOCKER} images | awk '$2 == "<none>" {print $3}');
  do  
    echo "ImageID: $n";
    ${DOCKER} inspect --format='{{.Id}} {{.Parent}}' $(${DOCKER} images --filter since=$n -q);
  done;

  ${DOCKER} rmi $(${DOCKER} images | awk '$2 == "<none>" {print $3}')
}

मेरी .bashrcफाइल में यह भी है ...

docker_rm_dangling ()  
{ 
  DOCKER=docker
  [ docker ps >/dev/null 2>&1 ] || DOCKER="sudo docker"

  echo "Docker: ${DOCKER}"

  ${DOCKER} images -f dangling=true 2>&1 > /dev/null && YES=$?;                                                                                                                  
  if [ $YES -eq 1 ]; then
    read -t 30 -p "Press ENTER to remove, or CTRL-C to quit.";
    ${DOCKER} rmi $(${DOCKER} images -f dangling=true -q);
  else
    echo "Nothing to do... all groovy!";
  fi  
}

के साथ काम करता है:

$ docker --version 
Docker version 17.05.0-ce, build 89658be

0

छवियों की सूची को हटाने का बल (उदाहरण के लिए संस्करण 10 को छोड़कर)

डॉकटर चित्र | grep संस्करण | grep -v version10> images.txt && $ में img के लिए (awk -F "" "{प्रिंट $ 3} '/root/images.txt); docker rmi -f $ img; किया हुआ


-1

आप बस यह कर सकते हैं:

➜ ~ sudo डोकर RMI 4ed13257bb55 -f नष्ट किया गया: SHA256: 4ed13257bb5512b975b316ef482592482ca54018a7728ea1fc387e873a68c358 नष्ट किया गया: SHA256: 4a478ca02e8d2336595dcbed9c4ce034cd15f01229733e7d93a83fbb3a9026d3 नष्ट किया गया: SHA256: 96df41d1ce6065cf75d05873fb1f9ea9fed0ca86addcfcec7722200ed3484c69 नष्ट किया गया: SHA256: d95efe864c7096c38757b80fddad12819fffd68ac3cc73333ebffaa42385fded


-1

इमेज लेयर: रिपोजिटरी को अक्सर इमेज या कंटेनर इमेज के रूप में संदर्भित किया जाता है, लेकिन वास्तव में वे एक या अधिक परतों से बनी होती हैं। रिपॉजिटरी में छवि परतें माता-पिता-बच्चे के रिश्ते में एक साथ जुड़ी हुई हैं। प्रत्येक छवि परत स्वयं और मूल परत के बीच परिवर्तनों का प्रतिनिधित्व करती है।

Docker बिल्डिंग पैटर्न वंशानुक्रम का उपयोग करता है । इसका मतलब है कि संस्करण संस्करण iपर निर्भर करता है i-1। इसलिए, हमें उस संस्करण i+1को हटाना चाहिए जो संस्करण को हटाने में सक्षम हो i। यह एक साधारण निर्भरता है।

यदि आप पिछले एक (सबसे अपडेटेड) और पहले (बेस) को छोड़कर सभी छवियों को हटाना चाहते हैं तो हम docker saveनीचे दिए गए कमांड का उपयोग करके अंतिम (सबसे अपडेट किया गया) को निर्यात कर सकते हैं।

docker save -o <output_file> <your_image-id> | gzip <output_file>.tgz

फिर, अब नीचे दिए गए छवि-आईडी का उपयोग करके सभी छवियों को हटा दें ।

docker rm -f <image-id i> | docker rm -f <image i-1> | docker rm -f <image-id i-2> ... <docker rm -f <image-id i-k> # where i-k = 1

अब, अपनी सहेजी गई tgz छवि को नीचे की तरह लोड करें।

gzip -c <output_file.tgz> | docker load

docker ps -q का उपयोग करके अपनी भरी हुई छवि की छवि-आईडी देखें। इसमें टैग और नाम नहीं है। आप बस नीचे दिए गए टैग और नाम को अपडेट कर सकते हैं।

docker tag <image_id> group_name/name:tag
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.