पुरानी और अप्रयुक्त डोकर छवियों को कैसे हटाएं


762

डॉकटर को लंबे समय तक चलाने पर, सिस्टम में बहुत सारी छवियां होती हैं। स्टोरेज को खाली करने के लिए मैं एक बार में सभी अप्रयुक्त डॉकरों की छवियों को कैसे हटा सकता हूं?

इसके अलावा, मैं महीनों पहले खींची गई तस्वीरों को भी हटाना चाहता हूं, जो सही हैं TAG

इसलिए, मैं केवल अप्रकाशित छवियों को हटाने के लिए नहीं कह रहा हूं। मैं सामान्य अप्रयुक्त छवियों को हटाने के लिए एक रास्ता खोज रहा हूं, जिसमें अप्रकाशित और अन्य छवियां शामिल हैं जैसे कि महीने पहले सही के साथ खींची गई TAG

जवाबों:


1402

अद्यतन सितंबर 2016: डॉकटर 1.13: पीआर 26108 और 86de7c0 के लिए कुछ नए आदेशों को यह देखने में मदद करने के लिए पेश करें कि डॉक डेमॉन डेटा डिस्क पर कितना स्थान ले रहा है और आसानी से "अनावश्यक" सफाई के लिए अनुमति देता है।

docker system pruneसभी झूलने वाले डेटा को हटा देगा (यानी क्रम में: कंटेनर बंद हो गए, बिना कंटेनरों के वॉल्यूम और बिना कंटेनर वाले चित्र)। यहां तक ​​कि अप्रयुक्त डेटा, -aविकल्प के साथ ।

आपके पास भी है:

के लिए अप्रयुक्त छवियों, उपयोग docker image prune -a(झूलने दूर करने के लिए और ununsed चित्र)।
चेतावनी: ' अप्रयुक्त ' का अर्थ है "किसी कंटेनर द्वारा संदर्भित चित्र नहीं": उपयोग करने से पहले सावधान रहें -a

जैसा कि एएल के जवाब में चित्रित किया गया है , docker system prune --allसभी अप्रयुक्त छवियों को न केवल झूलने वाले हटा देगा ... जो थोड़ा बहुत हो सकता है।

विकल्प केdocker xxx prune साथ संयोजन छंटाई को सीमित करने का एक शानदार तरीका हो सकता है ( docker SDK API 1.28 न्यूनतम, इसलिए docker 4.04 )--filter

वर्तमान में समर्थित फ़िल्टर हैं:

  • until (<timestamp>) - दिए गए टाइमस्टैम्प से पहले केवल कंटेनर, चित्र और नेटवर्क हटाएं
  • label( label=<key>, label=<key>=<value>, label!=<key>, या label!=<key>=<value>) - केवल (या के साथ कंटेनर, छवियों, नेटवर्क, और मात्रा को दूर किए बिना , के मामले में label!=...प्रयोग किया जाता है) निर्दिष्ट लेबल।

एक उदाहरण के लिए " Prune images " देखें ।


मूल उत्तर (सितम्बर 2016)

मैं आमतौर पर करता हूं:

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

मेरे पास उन [झूलने वाली छवियों] को हटाने के लिए एक उपनाम है : 13drmi

dangling=trueफिल्टर अप्रयुक्त छवियों पाता है

इस तरह, किसी भी मध्यवर्ती छवि को अब लेबल की गई छवि से संदर्भित नहीं किया जाता है।

मैं बाहर की प्रक्रियाओं (कंटेनरों) के लिए पहले ऐसा ही करता हूं

alias drmae='docker rm $(docker ps -qa --no-trunc --filter "status=exited")'

के रूप में haridsv टिप्पणियों में बताते हैं :

तकनीकी रूप से, आपको पहले छवियों को साफ करने से पहले कंटेनरों को साफ करना चाहिए, क्योंकि इससे अधिक झूलने वाली छवियां और कम त्रुटियां होंगी


जेस फ्रैजेल (जेफ्रैजेल) ने बैश आर्क फ़ंक्शन :

dcleanup(){
    docker rm -v $(docker ps --filter status=exited -q 2>/dev/null) 2>/dev/null
    docker rmi $(docker images --filter dangling=true -q 2>/dev/null) 2>/dev/null
}

पुरानी छवियों को हटाने के लिए, और न केवल "अप्रतिबंधित-झूलने" वाली छवियां, आप विचार कर सकते हैं docker-gc:


एक साधारण डॉकटर कंटेनर और छवि कचरा संग्रह स्क्रिप्ट।

  • एक घंटे से अधिक समय तक बाहर रहने वाले कंटेनरों को हटा दिया जाता है।
  • ऐसी छवियां जो किसी भी शेष कंटेनर से संबंधित नहीं हैं, उसके बाद हटा दी जाती हैं।

28
क्या "dangling=true"वास्तव में इसका क्या अर्थ है, इस पर प्रलेखन है?
सिवान

1
यह लिपि महीनों पहले खींची गई कुछ छवियों को नहीं हटा सकती है
क्वांलोंग

2
dcleanupकमाल है!
क्विनलॉन्ग

4
@ सबसे पहले, docker system pruneकेवल छवियों की तुलना में बहुत अधिक हटाता है। docker image pruneइसके बजाय उपयोग सुनिश्चित करें । और इसके साथ बहुत सावधान रहें-a : docker system prune -aविनाशकारी प्रभाव हो सकता है (साथ ही वॉल्यूम को हटाते हुए)। अंत में, हां, -aअप्रयुक्त छवियों को हटा देता है, मैं उत्तर को संपादित करूंगा।
VonC

2
@stom:। 'अप्रयुक्त' का अर्थ है "छवियों किसी भी कंटेनर द्वारा संदर्भित नहीं है, लेकिन झूलते सब (सिर्फ एक आईडी) पर टैग नहीं किया साधन
VonC

124

दूसरा अपडेट करें (2017-07-08):

VonC का संदर्भ लें (फिर से), और भी अधिक हाल के प्रयोग से system prune। अधीर -f, --forceविकल्प के साथ संकेत छोड़ सकता है:

docker system prune -f

अधीर और लापरवाह अतिरिक्त रूप से "अप्रयुक्त छवियों को न केवल झूलने वाले हटा सकते हैं" -a, --allविकल्प के साथ :

docker system prune -af

https://docs.docker.com/engine/reference/commandline/system_prune/

अपडेट करें:

VonC के उत्तर का संदर्भ लें जो हाल ही में जोड़े गए pruneआदेशों का उपयोग करता है । यहां संबंधित शेल उर्फ ​​सुविधा है:

alias docker-clean=' \
  docker container prune -f ; \
  docker image prune -f ; \
  docker network prune -f ; \
  docker volume prune -f '

पुराना उत्तर:

हटाए गए (निकाले गए) कंटेनर हटाएं:

$ docker ps --no-trunc -aqf "status=exited" | xargs docker rm

अप्रयुक्त (झूलने) चित्र हटाएं:

$ docker images --no-trunc -aqf "dangling=true" | xargs docker rmi

यदि आपने अपरिवर्तनीय डेटा हानि के संबंध में अत्यधिक सावधानी बरती है , तो आप अप्रयुक्त (झूलने) वॉल्यूम (v1.9 और ऊपर) को हटा सकते हैं:

$ docker volume ls -qf "dangling=true" | xargs docker volume rm

यहाँ वे एक सुविधाजनक खोल उपनाम में हैं:

alias docker-clean=' \
  docker ps --no-trunc -aqf "status=exited" | xargs docker rm ; \
  docker images --no-trunc -aqf "dangling=true" | xargs docker rmi ; \
  docker volume ls -qf "dangling=true" | xargs docker volume rm'

संदर्भ:


3
मैं वॉल्यूम क्लीनअप के साथ सावधानी बरतता हूँ। दोनों ने स्वचालित रूप से कंटेनर वॉल्यूम बनाए और नामांकित वॉल्यूम जो वर्तमान में उपयोग में नहीं हैं, झूलने के साथ एक साथ सूचीबद्ध हैं = सच।
BMitch

1
@ बिच, आप बिल्कुल सही हैं; मैं docker volume rmनुस्खा के लिए एक कड़ी चेतावनी जोड़ दिया है । आपके द्वारा दिए गए किसी भी सुझाव का मैं स्वागत करता हूँ।
rubicks

1
मैं नामांकित संस्करणों के लिए हमें एक अलग फिल्टर विकल्प देना पसंद करूंगा। अगर मैं एक अच्छा वर्कअराउंड लेकर आता हूं, तो मुझे शेयर करना सुनिश्चित होगा
BMitch

2
हाँ, लेकिन दुर्भाग्य से यह एक साधारण ध्वज के साथ अनाम कंटेनर वॉल्यूम से नामित वॉल्यूम को अलग नहीं करता है। मेरे द्वारा उपयोग की जा रही कमांड वह है docker volume ls -qf dangling=true | egrep '^[a-z0-9]{64}$' | xargs --no-run-if-empty docker volume rmजो तब तक काम करेगी जब तक कि आप अपने वॉल्यूम को एक गाइड के समान कुछ के साथ नाम न दें। मैं इसे नए फ़िल्टर सिंटैक्स के लिए ट्विक कर सकता हूं।
20

1
अप्रयुक्त (झूलने) संस्करणों को हटाने से वास्तव में हमारी मदद होती है!
केन

61

पुरानी टैग की गई छवियों को हटाने के लिए जो एक महीने से अधिक पुरानी हैं:

$ docker images --no-trunc --format '{{.ID}} {{.CreatedSince}}' \
    | grep ' months' | awk '{ print $1 }' \
    | xargs --no-run-if-empty docker rmi

ध्यान दें कि यह एक कंटेनर द्वारा उपयोग की जाने वाली छवियों को हटाने में विफल होगा , जिसे एक रिपॉजिटरी में संदर्भित किया गया है, जिसमें आश्रित बाल छवियां हैं ... जो शायद आप चाहते हैं। और सिर्फ -fझंडा जोड़ें ।

/etc/cron.daily/docker-gcस्क्रिप्ट का उदाहरण :

#!/bin/sh -e

# Delete all stopped containers (including data-only containers).
docker ps -a -q --no-trunc --filter "status=exited" | xargs --no-run-if-empty docker rm -v

# Delete all tagged images more than a month old
# (will fail to remove images still used).
docker images --no-trunc --format '{{.ID}} {{.CreatedSince}}' | grep ' months' | awk '{ print $1 }' | xargs --no-run-if-empty docker rmi || true

# Delete all 'untagged/dangling' (<none>) images
# Those are used for Docker caching mechanism.
docker images -q --no-trunc --filter dangling=true | xargs --no-run-if-empty docker rmi

# Delete all dangling volumes.
docker volume ls -qf dangling=true | xargs --no-run-if-empty docker volume rm

2
+1 पुराने डॉकटर चित्रों को हटाने के आदेश के लिए। यह थोड़ा हैकी है, लेकिन समाधान मूल है और पूरी तरह से काम करता है :)
रिक

3
यह अच्छा है, लेकिन मुझे लगता है कि यह केवल डॉक छवियों को हटाता है जो कम से कम 4 महीने पुराने हैं। .CreatedSinceउत्पादन में समय की इकाई के रूप में सप्ताह का उपयोग करता है यहां तक ​​कि उन छवियों पर भी जो कई सप्ताह पुरानी हैं, जैसे 12 weeks
joelittlejohn

2
यह मेरे लिए अच्छा और सरल काम है:docker images | grep ' months' | awk '{ print $3 }' | xargs --no-run-if-empty docker rmi -f
केंट बुल

32

अन्य उत्तर महान हैं, विशेष रूप से:

docker system prune # doesn't clean out old images
docker system prune --all # cleans out too much

लेकिन मुझे दो आज्ञाओं के बीच में कुछ की आवश्यकता थी इसलिए filterविकल्प वही था जिसकी मुझे आवश्यकता थी:

docker image prune --all --filter "until=4320h" # delete images older than 6 months ago; 4320h = 24 hour/day * 30 days/month * 6 months

उम्मीद है की वो मदद करदे :)

संदर्भ के लिए: https://docs.docker.com/config/pruning/#prune-images


24

मान लें कि आपके पास 1.13 या उच्चतर डॉक है, तो आप सिर्फ प्रून कमांड का उपयोग कर सकते हैं। अपने प्रश्न के लिए विशेष रूप से पुरानी छवियों को हटाने के लिए, आप पहले वाला चाहते हैं।

# Remove unused images
docker image prune

# Remove stopped containers.
docker container prune

# Remove unused volumes
docker volume prune

# Remove unused networks
docker network prune

# Command to run all prunes:
docker system prune

मैं कमांड का उपयोग करने की आदत नहीं डालने की सलाह docker system pruneदूंगा। मुझे लगता है कि उपयोगकर्ता गलती से उन चीजों को हटा देंगे जिनका वे मतलब नहीं है। व्यक्तिगत रूप से, मैं मुख्य रूप से docker image pruneऔर docker container pruneकमांड का उपयोग करने जा रहा हूं ।


4
आप अप्रयुक्त नेटवर्क prune नहीं करना चाहते हैं आप? जैसे, यदि सभी कंटेनरों को रोक दिया जाता है, और मैं उन नेटवर्कों को हटा देता हूं, तो यदि मैं उन्हें शुरू कर दूंगा तो वे कैसे काम करेंगे। क्या docker run के साथ नेटवर्क तैयार किया जाता है?
मेफ़ेक्ट

@meffect मैं पूरी तरह से सहमत हूँ और भगवान को पता चला कि मैंने नेटवर्क छोड़ दिया है। मैंने इसे शामिल किया है और अंत में एक भाग जोड़ा है जिसमें कहा गया है कि मैं उपयोग करने की सलाह नहीं docker system pruneदूंगा लेकिन व्यक्तिगत prunes।
प्रोग्रामर

15

अब तक (डॉकर संस्करण 1.12) हम सभी चल रहे कंटेनरों को हटाने के लिए निम्न आदेश का उपयोग कर रहे हैं। इसके अलावा, यदि हम वॉल्यूम हटाना चाहते हैं, तो हम निम्नलिखित कमांड में अपने संबंधित टैग -v का उपयोग करके मैन्युअल रूप से कर सकते हैं।

सभी Exit कंटेनरों को हटा दें

docker rm $(docker ps -q -f status=exited)

सभी बंद कंटेनर को हटा दें

docker rm $(docker ps -a -q)

सभी चल रहे और बंद कंटेनर को हटा दें

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

सभी कंटेनर निकालें, बिना किसी मापदंड के

docker container rm $(docker container ps -aq)

लेकिन, पूर्ण प्रणाली और सफाई के लिए, संस्करण 1.13 और इसके बाद के संस्करण में, हम निम्नलिखित कमांड को सीधे उपयोगकर्ता कर सकते हैं:

docker system prune

सभी अप्रयुक्त कंटेनर, चित्र, नेटवर्क और वॉल्यूम हटा दिए जाएंगे। हम निम्न आदेशों का उपयोग करके भी ऐसा कर सकते हैं जो व्यक्तिगत घटकों को साफ करते हैं:

docker container prune
docker image prune
docker network prune
docker volume prune


13

निम्न आदेश 48 घंटे से अधिक पुरानी छवियों को हटा देगा।

$ docker image prune --all --filter until=48h

1
फ़िल्टर का उपयोग करना भी एक निर्दिष्ट संस्करण से पहले हर संस्करण को सूचीबद्ध करना संभव है: docker image ls --all --filter reference=monolito --filter before=monolito:0.1.8और फिर हटाने के लिए एक rmi कमांड लागू करें। docker rmi $(docker image ls -q --all --filter reference=monolito --filter before=monolito:0.1.8)
छड़ावलोप्स

9

मैंने हाल ही में अपने एक सर्वर पर इसे हल करने के लिए एक स्क्रिप्ट लिखी है:

#!/bin/bash

# Remove all the dangling images
DANGLING_IMAGES=$(docker images -qf "dangling=true")
if [[ -n $DANGLING_IMAGES ]]; then
    docker rmi "$DANGLING_IMAGES"
fi

# Get all the images currently in use
USED_IMAGES=($( \
    docker ps -a --format '{{.Image}}' | \
    sort -u | \
    uniq | \
    awk -F ':' '$2{print $1":"$2}!$2{print $1":latest"}' \
))

# Get all the images currently available
ALL_IMAGES=($( \
    docker images --format '{{.Repository}}:{{.Tag}}' | \
    sort -u \
))

# Remove the unused images
for i in "${ALL_IMAGES[@]}"; do
    UNUSED=true
    for j in "${USED_IMAGES[@]}"; do
        if [[ "$i" == "$j" ]]; then
            UNUSED=false
        fi
    done
    if [[ "$UNUSED" == true ]]; then
        docker rmi "$i"
    fi
done

8

यहाँ डॉकर छवियों को साफ करने और स्थान को पुनः प्राप्त करने के लिए एक स्क्रिप्ट है।

#!/bin/bash -x
## Removing stopped container
docker ps -a | grep Exited | awk '{print $1}' | xargs docker rm

## If you do not want to remove all container you can have filter for days and weeks old like below
#docker ps -a | grep Exited | grep "days ago" | awk '{print $1}' | xargs docker rm
#docker ps -a | grep Exited | grep "weeks ago" | awk '{print $1}' | xargs docker rm

## Removing Dangling images
## There are the layers images which are being created during building a Docker image. This is a great way to recover the spaces used by old and unused layers.

docker rmi $(docker images -f "dangling=true" -q)

## Removing images of perticular pattern For example
## Here I am removing images which has a SNAPSHOT with it.

docker rmi $(docker images | grep SNAPSHOT | awk '{print $3}')

## Removing weeks old images

docker images | grep "weeks ago" | awk '{print $3}' | xargs docker rmi

## Similarly you can remove days, months old images too.

मूल लिपि

https://github.com/vishalvsh1/docker-image-cleanup

आमतौर पर डॉकर छवि निर्माण और परतों से संबंधित सभी अस्थायी फाइलों को रखता है

/ Var / lib / डोकर

यह पथ सिस्टम के लिए स्थानीय है, आमतौर पर रूट विभाजन पर, "/"

आप एक बड़ा डिस्क स्थान माउंट कर सकते हैं और /var/lib/dockerनए माउंट स्थान की सामग्री को स्थानांतरित कर सकते हैं और एक प्रतीकात्मक लिंक बना सकते हैं।

इस तरह, भले ही डॉकर छवियां अंतरिक्ष पर कब्जा कर लें, यह आपके सिस्टम को प्रभावित नहीं करेगा क्योंकि यह कुछ अन्य माउंट स्थान का उपयोग करेगा।

मूल पोस्ट: स्थानीय डिस्क पर डॉकर छवियों को प्रबंधित करें


6

मैं इस कमांड का उपयोग कर रहा हूं:

export BEFORE_DATETIME=$(date --date='10 weeks ago' +"%Y-%m-%dT%H:%M:%S.%NZ")
docker images -q | while read IMAGE_ID; do
    export IMAGE_CTIME=$(docker inspect --format='{{.Created}}' --type=image ${IMAGE_ID})
    if [[ "${BEFORE_DATETIME}" > "${IMAGE_CTIME}" ]]; then
        echo "Removing ${IMAGE_ID}, ${BEFORE_DATETIME} is earlier then ${IMAGE_CTIME}"
        docker rmi -f ${IMAGE_ID};
    fi;
done

यह उन सभी छवियों को हटा देगा जिनके निर्माण का समय 10 सप्ताह पहले से अधिक है।


मुझे लगता है कि आपने अदला IMAGE_CTIME- बदली की और BEFORE_DATETIMEउस echoआदेश में
Udo G

5

यदि आप X महीने पहले खींची गई छवियों को हटाना चाहते हैं , तो आप नीचे दिए गए उदाहरणों को आज़मा सकते हैं जो तीन महीने पहले बनाई गई छवियों को हटाते हैं:

three_months_old_images=`docker images | grep -vi "<none>" | tr -s ' ' | cut -d" " -f3,4,5,6 | grep "3 months ago" | cut -d" " -f1`
docker rmi $three_months_old_images

1
यह सही नहीं है। यह 3 महीने पहले बनाई गई छवियों को हटाता है , न कि 3 महीने पहले खींची गई छवियाँ (यदि आप उन्हें किसी दूरस्थ स्रोत से खींचते हैं, तो वे पहले से ही 3 महीने पुरानी हो सकती हैं)।
एंड्रयू फेरियर

इससे मुझे अलग-अलग मानदंडों के आधार पर अधिक फिल्टर बनाने में मदद मिली
david.sansay


3

docker system prune -a

(आपको आदेश की पुष्टि करने के लिए कहा जाएगा। -fयदि आप जानते हैं कि आप क्या कर रहे हैं, तो बल प्रयोग का उपयोग करें ।)


5
यह खतरनाक है , इसके docker system pruneसाथ नामांकित संस्करणों को हटाने के बारे में अन्य टिप्पणियां देखें -a
रिचवेल

3

@VonC ने पहले से ही बहुत अच्छा जवाब दिया था, लेकिन पूर्णता के लिए यहां एक छोटी स्क्रिप्ट है जिसका मैं उपयोग कर रहा हूं --- और जो किसी भी गलत डॉक प्रक्रिया को नाकाम करता है, आपके पास कुछ होना चाहिए:

#!/bin/bash

imgs=$(docker images | awk '/<none>/ { print $3 }')
if [ "${imgs}" != "" ]; then
   echo docker rmi ${imgs}
   docker rmi ${imgs}
else
   echo "No images to remove"
fi

procs=$(docker ps -a -q --no-trunc)
if [ "${procs}" != "" ]; then
   echo docker rm ${procs}
   docker rm ${procs}
else
   echo "No processes to purge"
fi

महान काम करता है, लेकिन अभी भी प्राप्त कर सकते हैं Error response from daemon: You cannot remove a running containerdocker kill $(docker ps -q)पता करने के लिए लाइन 3 से पहले जोड़ा गया
विंसेंट

के $(docker images -q)बजाय का उपयोग क्यों नहीं $(docker images | awk '/<none>/ { print $3 }')?
सीएफ

1
@ एसईएफ: यदि मैं करूं तो docker images -qमुझे छवि आईडी का सदिश मिल जाएगा, और कुछ नहीं। यदि मैं जो करता हूं, मैं उसे और अधिक प्राप्त करता हूं - मुझे <none>यहां पर जैसा कि मैं करता हूं, मुझे फ़िल्टर करने की अनुमति देता है। समझ में आता है?
डिर्क एडल्डबुलेटेल

2

टैग की गई छवियों को हटाने के लिए जिनके पास कंटेनर नहीं चल रहा है, आपको थोड़ी स्क्रिप्ट का उपयोग करना होगा:

#!/bin/bash

# remove not running containers
docker rm $(docker ps -f "status=exited" -q)

declare -A used_images

# collect images which has running container
for image in $(docker ps | awk 'NR>1 {print $2;}'); do
    id=$(docker inspect --format="{{.Id}}" $image);
    used_images[$id]=$image;
done

# loop over images, delete those without a container
for id in $(docker images --no-trunc -q); do
    if [ -z ${used_images[$id]} ]; then
        echo "images is NOT in use: $id"
        docker rmi $id
    else
        echo "images is in use:     ${used_images[$id]}"
    fi
done

2

हफ्तों पहले पुराने कंटेनर निकालें।

docker rm $(docker ps -a | grep "weeks" | awk '{ print $1; }')

हफ्तों पहले की पुरानी छवियां निकालें। सावधान रहे। यह उन आधार चित्रों को हटा देगा जो सप्ताह पहले बनाए गए थे लेकिन जो आपकी नई छवियों का उपयोग कर रहे होंगे।

docker rmi $(docker images | grep 'weeks' | awk '{ print $3; }')


2

टैग की गई इमेज को कैसे हटाएं

  1. docker rmi टैग को पहले

  2. docker rmi छवि।

    # जो एक docker rmi कॉल में किया जा सकता है जैसे: # docker rmi <repo: tag> <imageid>

(यह नवंबर 2016 में काम करता है, डॉकर संस्करण 1.12.2)

जैसे

$ docker images 
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
usrxx/the-application   16112805            011fd5bf45a2        12 hours ago        5.753 GB
usryy/the-application   vx.xx.xx            5af809583b9c        3 days ago          5.743 GB
usrzz/the-application   vx.xx.xx            eef00ce9b81f        10 days ago         5.747 GB
usrAA/the-application   vx.xx.xx            422ba91c71bb        3 weeks ago         5.722 GB
usrBB/the-application   v1.00.18            a877aec95006        3 months ago        5.589 GB

$ docker rmi usrxx/the-application:16112805 && docker rmi 011fd5bf45a2
$ docker rmi usryy/the-application:vx.xx.xx && docker rmi 5af809583b9c
$ docker rmi usrzz/the-application:vx.xx.xx eef00ce9b81f
$ docker rmi usrAA/the-application:vx.xx.xx 422ba91c71bb
$ docker rmi usrBB/the-application:v1.00.18 a877aec95006

जैसे स्क्रिप्टेड 2 सप्ताह से अधिक पुरानी कुछ भी हटा दें।

IMAGESINFO=$(docker images --no-trunc --format '{{.ID}} {{.Repository}} {{.Tag}} {{.CreatedSince}}' |grep -E " (weeks|months|years)")
TAGS=$(echo "$IMAGESINFO" | awk '{ print $2 ":" $3 }' )
IDS=$(echo "$IMAGESINFO" | awk '{ print $1 }' )
echo remove old images TAGS=$TAGS IDS=$IDS
for t in $TAGS; do docker rmi $t; done
for i in $IDS; do docker rmi $i; done


1
docker rm `docker ps -aq`

या

docker rm $(docker ps -q -f status=exited)

3
मुझे लगता है कि यह उत्तर खतरनाक है क्योंकि वे आदेश कंटेनरों को हटाते हैं। सबसे पहले, ओपी पूछ रहा था कि छवियों को कैसे हटाया जाए, कंटेनरों को नहीं। और इससे भी महत्वपूर्ण बात, उन आदेशों के कारण डेटा का नुकसान हो सकता है क्योंकि लोगों के पास बाहर के कंटेनरों में कुछ मूल्यवान डेटा हो सकता है।
u.unver34

आपको इन आदेशों को उत्पादन सर्वर पर लागू करने के संभावित अवांछित परिणामों का वर्णन करना चाहिए।
डैनियल

यह कंटेनरों को हटाता है, छवियों को नहीं।
SeF

1

कभी-कभी मैं उन मुद्दों में भाग लेता हूं जहां डॉकर आवंटित करेगा और डिस्क स्थान का उपयोग करना जारी रखेगा, भले ही वह स्थान किसी विशेष छवि या मौजूदा कंटेनर को आवंटित नहीं किया गया हो। जिस तरह से मैंने इस मुद्दे को गलती से उत्पन्न किया है, वह नवीनतम है "आरओईएल 7.1 में" डॉकटर "के बजाय" डॉक-इंजन "सेंटोस बिल्ड का उपयोग करना। ऐसा लगता है कि कभी-कभी कंटेनर क्लीन-अप सफलतापूर्वक पूरा नहीं होता है और फिर अंतरिक्ष का पुन: उपयोग नहीं किया जाता है। जब 80GB ड्राइव मैं के रूप में आवंटित / के साथ भरा था / var / lib / docker फाइलें मुझे इस मुद्दे को हल करने के लिए रचनात्मक तरीके से आना था।

यहां वह है जो मैंने जुटाया। डिस्क पूर्ण त्रुटि को हल करने के लिए सबसे पहले:

  1. स्टॉप डोकर: systemctl stop डॉकटर
  2. / Mnt / docker के रूप में मुहिम शुरू की गई एक नई ड्राइव आवंटित की।
  3. सभी फाइलों को / var / lib / docker में / mnt / docker पर ले जाएँ। मैंने कमांड का उपयोग किया: rsync -aPHSx --remove-source-files / var / lib / docker / / mnt / docker /
  4. नई ड्राइव को / var / lib / docker पर माउंट करें।

इस बिंदु पर मुझे अब डिस्क पूर्ण त्रुटि नहीं थी, लेकिन मैं अभी भी अंतरिक्ष की एक बड़ी राशि बर्बाद कर रहा था। अगले कदमों का ध्यान रखना है।

  1. डॉकटर प्रारंभ करें: systemctl start docker

  2. सभी छवियां सहेजें: docker $ बचाएं (docker images। Sed -e '/ ^ / d' -e '/ ^ REPOSITORY / d' -e 's, []] :,' -e 's, [ ] , ,, ')> /root/docker.img

  3. स्थापना रद्द करने वाला।

  4. / Var / lib / docker में सब कुछ मिटा दें: rm -rf / var / lib / docker / [cdintv * *

  5. स्थापना रद्द करें

  6. डॉकटर को सक्षम करें: सिस्टेक्टल को डॉकटर को सक्षम करें

  7. प्रारंभकर्ता: प्रारंभकर्ता प्रारंभकर्ता

  8. छवियों को पुनर्स्थापित करें: docker load </root/docker.img

  9. किसी भी निरंतर कंटेनर को शुरू करें जिसे आपको चलाने की आवश्यकता है।

इसने मेरे डिस्क उपयोग को ६cker जीबी से डॉकटर के लिए ६ जीबी कर दिया।

मैं इसे रोजमर्रा के इस्तेमाल के लिए नहीं सुझाता। लेकिन यह चलाने के लिए उपयोगी है जब ऐसा लगता है कि docker ने सॉफ़्टवेयर त्रुटियों, या अप्रत्याशित रिबूट के लिए उपयोग किए गए डिस्क स्थान का ट्रैक खो दिया है।


1

यदि आप स्वचालित रूप से / समय-समय पर बाहर निकलने वाले कंटेनरों को साफ करना चाहते हैं और उन छवियों और संस्करणों को हटाते हैं जो एक चल रहे कंटेनर द्वारा उपयोग नहीं किए जाते हैं तो आप छवि को डाउनलोड कर सकते हैं meltwater/docker-cleanup

बस दौडो:

docker run -d -v /var/run/docker.sock:/var/run/docker.sock:rw  -v /var/lib/docker:/var/lib/docker:rw --restart=unless-stopped meltwater/docker-cleanup:latest

यह हर 30 मिनट में डिफ़ॉल्ट रूप से चलता है। हालाँकि आप इस झंडे का उपयोग सेकंड में विलंब समय सेट कर सकते हैं (DELAY_TIME = 1800 विकल्प)।

अधिक जानकारी: https://github.com/meltwater/docker-cleanup/blob/master/README.md


1

यदि आप इन छंटाई वाली छवियों का निर्माण स्वयं (कुछ अन्य, पुरानी आधार छवियों से) करते हैं, तो कृपया ऊपर दिए गए स्वीकृत समाधानों के साथ सावधान रहें docker image prune, क्योंकि कमांड कुंद है और आपकी नवीनतम छवियों द्वारा आवश्यक सभी निर्भरताओं को दूर करने का प्रयास करेगा (कमांड होना चाहिए शायद नाम बदलकर docker image*s* prune)।

समाधान मैं अपने docker छवि निर्माण पाइपलाइनों के लिए आया (जहाँ दैनिक बिल्ड हैं और टैग = दिनांक YYYYMMDDप्रारूप में हैं) यह है:

# carefully narrow down the image to be deleted (to avoid removing useful static stuff like base images)
my_deleted_image=mirekphd/ml-cpu-py37-vsc-cust

# define the monitored image (tested for obsolescence), which will be usually the same as deleted one, unless deleting some very infrequently built image which requires a separate "clock"
monitored_image=mirekphd/ml-cache

# calculate the oldest acceptable tag (date)
date_week_ago=$(date -d "last week" '+%Y%m%d')

# get the IDs of obsolete tags of our deleted image
# note we use monitored_image to test for obsolescence
my_deleted_image_obsolete_tag_ids=$(docker images --filter="before=$monitored_image:$date_week_ago" | grep $my_deleted_image | awk '{print $3}')

# remove the obsolete tags of the deleted image
# (note it typically has to be forced using -f switch)
docker rmi -f $my_deleted_image_obsolete_tag_ids

0

गौरैया प्लगइन docker-remove-dangling-images आप बंद कंटेनर और अप्रयुक्त (झूलने) छवियों को साफ करने के लिए उपयोग कर सकते हैं

$ sparrow plg run docker-remove-dangling-images

यह लिनक्स और विंडोज ओएस दोनों के लिए काम करता है।


0

सबसे पहले, docker imagesछवियों की सूची देखने के लिए चलाएँ और क्लिपबोर्ड में IMAGE HASH ID की प्रतिलिपि बनाएँ।

Daud docker rmi -f <Image>

याद रखें विकल्प -fबल हटाना है।

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