পুরানো এবং অব্যবহৃত ডকার চিত্রগুলি কীভাবে সরাবেন


762

দীর্ঘ সময় ধরে ডকার চালানোর সময় সিস্টেমে প্রচুর চিত্র রয়েছে। সঞ্চয়স্থানটি মুক্ত করার জন্য আমি কীভাবে একসাথে সমস্ত অব্যবহৃত ডকার চিত্রগুলি সরিয়ে ফেলতে পারি?

এছাড়াও, আমি কয়েক মাস আগে টানা চিত্রগুলিও সরাতে চাই, যা সঠিক রয়েছে TAG

সুতরাং, আমি কেবল অবরুদ্ধ চিত্রগুলি অপসারণের জন্য বলছি না। আমি সাধারণ অব্যবহৃত চিত্রগুলি অপসারণের জন্য একটি উপায় অনুসন্ধান করছি, যার মধ্যে সঠিকভাবে কয়েক মাস পূর্বে টানা অবিযুক্ত এবং অন্যান্য চিত্র উভয়ই অন্তর্ভুক্ত রয়েছে TAG

উত্তর:


1402

আপডেট সেপ্টেম্বর 2016: Docker 1.13: জনসংযোগ 26108 এবং 86de7c0 কমিট কয়েকটি নতুন কমান্ড সাহায্যের জন্য visualizing সহজতর কতটা স্থান Docker ডেমন ডেটা ডিস্কে গ্রহণ এবং সহজে পরিষ্কার আপ "অপ্রয়োজনীয়" বাড়তি জন্য অনুমতি পরিচয় দিন।

docker system pruneসমস্ত ঝুঁকির ডেটা মুছে ফেলবে (অর্থাত ক্রমানুসারে: ধারকগুলি থামানো হয়েছে, ধারক ছাড়া ভলিউম এবং কোনও পাত্রে নেই চিত্র)। এমনকি অপ্রয়োজনীয় ডেটা, -aবিকল্প সহ।

আপনারও রয়েছে:

জন্য অব্যবহৃত চিত্র, ব্যবহার docker image prune -a(আনত সরানোর জন্য এবং ununsed চিত্র)।
সতর্কতা: ' অব্যবহৃত ' অর্থ "চিত্রগুলি কোনও ধারক দ্বারা রেফারেন্স করা হয় না": ব্যবহারের আগে সতর্ক থাকুন -a

আল -এর উত্তরে যেমন চিত্রিত হয়েছে , docker system prune --allসমস্ত অব্যবহৃত চিত্রগুলি কেবল ঝাঁকুনিযুক্ত চিত্রই সরিয়ে ফেলবে ... যা কিছুটা খুব বেশি হতে পারে।

মিশ্রন docker xxx pruneসঙ্গে --filterবিকল্প (কেঁটে সাফ সীমিত করতে একটি দুর্দান্ত উপায় হতে পারে তাই হয়, Docker SDK এর এপিআই 1,28 ন্যূনতম Docker 17.04+ )

বর্তমানে সমর্থিত ফিল্টারগুলি হ'ল:

  • until (<timestamp>) - প্রদত্ত টাইমস্ট্যাম্পের আগে তৈরি পাত্রে, চিত্রগুলি এবং নেটওয়ার্কগুলি কেবল সরিয়ে দিন
  • label( label=<key>, label=<key>=<value>, label!=<key>, অথবা label!=<key>=<value>) - শুধুমাত্র (অথবা সঙ্গে পাত্রে, চিত্র, নেটওয়ার্ক, এবং ভলিউম অপসারণ ছাড়া , এ ক্ষেত্রে label!=...ব্যবহার করা হয়) নির্দিষ্ট করা লেবেলগুলি।

উদাহরণস্বরূপ " ছাঁটাই চিত্রগুলি " দেখুন ।


আসল উত্তর (সেপ্টেম্বর 2016)

আমি সাধারণত:

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

এই [ঝুলন্ত চিত্রগুলি] অপসারণের জন্য আমার একটি নাম আছে 13 :drmi

dangling=trueফিল্টার অব্যবহৃত চিত্র খুঁজে বের করে

এইভাবে, কোনও মধ্যবর্তী চিত্র আর কোনও লেবেলযুক্ত চিত্র দ্বারা রেফারেন্স করা সরিয়ে ফেলা হবে না।

আমি প্রস্থানিত প্রক্রিয়া (পাত্রে) জন্য প্রথম একই কাজ

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

হিসাবে haridsv আউট পয়েন্ট মন্তব্য :

প্রযুক্তিগতভাবে, আপনার ছবিগুলি সাফ করার আগে প্রথমে পাত্রে পরিষ্কার করা উচিত, কারণ এটি আরও ঝুঁকির চিত্র এবং কম ত্রুটি ধরা পড়বে


জেস ফ্রেজেল (jfrazelle) এর বাশার্ক ফাংশন রয়েছে :

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:


একটি সাধারণ ডকার ধারক এবং চিত্র আবর্জনা সংগ্রহের স্ক্রিপ্ট।

  • এক ঘন্টারও বেশি সময় আগে থাকা পাত্রে সরিয়ে ফেলা হয়েছে are
  • এরপরে কোনও অবশিষ্ট পাত্রে অন্তর্ভুক্ত নয় এমন চিত্রগুলি সরানো হবে।

28
"dangling=true"আসলে কী বোঝাতে পারে তার ডকুমেন্টেশন আছে ?
সিভিফ্যান

1
এই স্ক্রিপ্টটি কয়েক মাস আগে টানা কিছু চিত্র সরিয়ে ফেলতে পারে না
কোয়ানলং

2
dcleanupঅসাধারণ!
কোয়ানলং

4
@ হার্ম ফার্স্ট, docker system pruneকেবল চিত্রের চেয়ে অনেক বেশি সরিয়ে দেয়। docker image pruneপরিবর্তে ব্যবহার নিশ্চিত করুন । এবং এর সাথে খুব সাবধানতা অবলম্বন করুন-a : docker system prune -aএকটির ধ্বংসাত্মক প্রভাব থাকতে পারে (খণ্ডগুলিও সরিয়ে ফেলতে পারে)। অবশেষে, হ্যাঁ, -aঅব্যবহৃত চিত্রগুলি সরান, আমি উত্তরটি সম্পাদনা করব।
ভোনসি

2
@ স্টম: 'অব্যবহৃত' অর্থ "চিত্রগুলি কোনও ধারক দ্বারা রেফারেন্স করা হয় না, তবে ঝোলা মানেই মোটেও ট্যাগ করা হয়নি (কেবল একটি আইডি)
ভোনসি

124

দ্বিতীয়টি আপডেট করুন (2017-07-08):

আরও সাম্প্রতিক ব্যবহার করে ভনসিকে (আবার) দেখুন 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
আমি ভলিউম পরিষ্কারের সাথে সতর্কতা অবলম্বন করব। উভয় স্বয়ংক্রিয়ভাবে কনটেইনার ভলিউম তৈরি হয়েছে এবং নাম ব্যবহৃত ভলিউম যা বর্তমানে ব্যবহৃত হয় না সেগুলি ঝুঁকির সাথে = সত্যের সাথে একত্রে তালিকাভুক্ত করা হয়।
বিএমইচ

1
@ বিমিচ, আপনি একেবারে সঠিক; আমি docker volume rmরেসিপিটিতে একটি কঠোর সতর্কতা যুক্ত করেছি । আপনার কোন পরামর্শ আমি স্বাগত জানাব।
রিক্স

1
আমি নামকৃত ভলিউমের জন্য আমাদের আলাদা ফিল্টার বিকল্প দিতে ডকারকে পছন্দ করব। আমি যদি ভাল কাজের সাথে সামনে আসি তবে আমি অবশ্যই শেয়ার করব।
বিএমইচ

2
হ্যাঁ, তবে দুর্ভাগ্যক্রমে এটি নামযুক্ত ভলিউমটিকে একটি অনামী কনটেইনার ভলিউম থেকে একটি সরল পতাকা দিয়ে আলাদা করে না। আমি যে কমান্ডটি ব্যবহার করে আসছি তা হ'ল docker volume ls -qf dangling=true | egrep '^[a-z0-9]{64}$' | xargs --no-run-if-empty docker volume rmততক্ষণ কাজ করবে যতক্ষণ আপনি কোনও নির্দেশিকার অনুরূপ কোনও কিছুর সাথে আপনার খণ্ডের নাম রাখবেন না। আমি নতুন ফিল্টার সিনট্যাক্সের জন্য এটি টুইট করতে পারি।
বিএমইচ

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 বা তার বেশি রয়েছে আপনি কেবল ছাঁটাই কমান্ড ব্যবহার করতে পারেন। আপনার প্রশ্নের জন্য বিশেষত পুরানো চিত্রগুলি সরিয়ে দেওয়ার জন্য, আপনি প্রথমটি চান want

# 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

আমি কমান্ডটি ব্যবহার না করার অভ্যাস করব would docker system pruneআমি মনে করি ব্যবহারকারীরা দুর্ঘটনাক্রমে তাদের বোঝানো জিনিসগুলি মুছে ফেলবে। ব্যক্তিগতভাবে, আমি প্রধানত কমান্ড docker image pruneএবং docker container pruneকমান্ড ব্যবহার করতে যাচ্ছি ।


4
আপনি অব্যবহৃত নেটওয়ার্কগুলি ছাঁটাই করতে চান না? যেমন, যদি সমস্ত ধারক বন্ধ হয়ে যায়, এবং আমি সেই নেটওয়ার্কগুলি মুছে ফেলি, তবে আমি তাদের শুরু করলে তারা কীভাবে পাত্রে কাজ করবে। নেটওয়ার্কগুলি কি ডকার রানের সাথে তৈরি হয়?
মার্ফেক্ট

@ প্রভাব আমি সম্পূর্ণরূপে একমত এবং networkশ্বর স্পট যে আমি নেটওয়ার্ক ছাঁটাই ফেলে রেখেছি। আমি এটি অন্তর্ভুক্ত করেছি এবং শেষে একটি অংশ যুক্ত করে বলেছি যে আমি ব্যবহারের সুপারিশ করব না docker system pruneতবে পৃথক ছাঁটাই।
প্রোগ্রামার্স

15

এখন অবধি (ডকার সংস্করণ 1.12) আমরা চলমান সমস্ত পাত্রে মুছে ফেলার জন্য নিম্নলিখিত কমান্ডটি ব্যবহার করছি। এছাড়াও, আমরা যদি ভলিউমগুলি মুছতে চান, তবে আমরা নিম্নলিখিত কমান্ডটিতে স্ব স্ব ট্যাগ -v ব্যবহার করে ম্যানুয়ালি এটি করতে পারি।

সমস্ত এক্সটেনড পাত্রে মুছুন

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 / Docker

এই পাথটি সিস্টেমের কাছে স্থানীয়, সাধারণত রুট বিভাজনে, "/"

আপনি একটি বড় ডিস্ক স্পেস মাউন্ট করতে পারেন এবং এর সামগ্রীটি স্থানান্তর করতে পারেন /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 সপ্তাহ আগে ago


আমি মনে করি আপনি বদলে গেছেন IMAGE_CTIMEএবং BEFORE_DATETIMEসেই echoআদেশে
ইউডো জি

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 মাস বয়সী হতে পারে)।
অ্যান্ড্রু ফেরিয়ার 4'16

এটি আমাকে বিভিন্ন মাপদণ্ডের ভিত্তিতে আরও ফিল্টার তৈরি করতে সহায়তা করেছিল
ডেভিড.সানসায়


3

docker system prune -a

(আপনাকে কমান্ডটি নিশ্চিত করতে বলা হবে। -fআপনি কী করছেন তা যদি জেনে থাকেন তবে রান চালানোর জন্য ব্যবহার করুন ))


5
এই বিপজ্জনক প্রায় অপরের মন্তব্য দেখতে docker system pruneএমনকি নামে ভলিউম অপসারণ -a
রিচভেল

3

@ ভনসি ইতিমধ্যে একটি খুব সুন্দর উত্তর দিয়েছে, তবে সম্পূর্ণতার জন্য আমি এখানে একটি ছোট স্ক্রিপ্ট ব্যবহার করছি --- এবং যা আপনার কোনও ডরারের প্রক্রিয়াও জোরদার করতে পারে:

#!/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 container। যোগ করা হয়েছে docker kill $(docker ps -q)লাইন 3 সামনে ঠিকানায়
ভিনসেন্ট

$(docker images -q)পরিবর্তে ব্যবহার করবেন না কেন $(docker images | awk '/<none>/ { print $3 }')?
SEF

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. প্রথমে ট্যাগটি ডমির করুন mi

  2. ছবিটি ডকারে আরএমআই করুন।

    # যা একটি ডকার আরএমআই কল হিসাবে করা যেতে পারে যেমন: # ডকার আরএমআই <রেপো: ট্যাগ> <চিত্র>

(এটি নভেম্বর 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
আমি মনে করি এই উত্তরটি বিপজ্জনক কারণ এই আদেশগুলি পাত্রে সরিয়ে দেয়। প্রথমত, ওপি পাত্রে নয়, কীভাবে চিত্রগুলি সরিয়ে ফেলতে বলছিল remove এবং আরও গুরুত্বপূর্ণ, এই কমান্ডগুলির ফলে লোকসানের পাত্রে কিছু মূল্যবান ডেটা থাকতে পারে বলে তথ্য হারাতে পারে।
u.unver34

প্রোডাকশন সার্ভারে এই আদেশগুলি প্রয়োগ করার সম্ভাব্য অযাচিত ফলাফলগুলি বর্ণনা করা উচিত।
ড্যানিয়েল

এটি চিত্রগুলি নয়, পাত্রে সরিয়ে দেয়।
SEF

1

মাঝেমধ্যে আমি এমন সমস্যাগুলিতে চলে এসেছি যেখানে ডকার ডিস্কের স্থান বরাদ্দ করে এবং ব্যবহার চালিয়ে যাবে, এমনকি কোনও নির্দিষ্ট চিত্র বা বিদ্যমান ধারককে স্থান বরাদ্দ না করা হলেও। সর্বশেষতম উপায়টি আমি ঘটনাক্রমে এই সমস্যাটি তৈরি করেছি আরএইচএল EL.১-তে "ডকার" এর পরিবর্তে "ডকার-ইঞ্জিন" সেন্টোস বিল্ড ব্যবহার করছিলাম। যা ঘটতে পারে বলে মনে হয় তা হ'ল কন্টেইনার ক্লিন-আপগুলি সফলভাবে শেষ হয় না এবং তারপরে স্পেসটি কখনও পুনরায় ব্যবহার করা হয় না। আমি যখন 80 গিগাবাইট ড্রাইভটি বরাদ্দ করি / / var / lib / ডকার ফাইলগুলি ভরাট হত তখন সমস্যার সমাধানের জন্য আমাকে একটি সৃজনশীল উপায় নিয়ে আসতে হয়েছিল।

এখানে আমি যা নিয়ে এসেছি তা এখানে। ডিস্ক সম্পূর্ণ ত্রুটি সমাধান করার জন্য প্রথমে:

  1. স্টপ ডকার: systemctl স্টপ ডকার
  2. / Mnt / ডকার হিসাবে মাউন্ট করা একটি নতুন ড্রাইভ বরাদ্দ করা হয়েছে।
  3. সমস্ত ফাইল / var / lib / ডকারে / mnt / ডকারে সরান। আমি কমান্ডটি ব্যবহার করেছি: rsync -aPHSx --remove-উত্স-ফাইলগুলি / var / lib / ডকার / / mnt / ডকার /
  4. নতুন ড্রাইভটি / var / lib / ডকারে মাউন্ট করুন।

এই মুহুর্তে আমার আর ডিস্ক পূর্ণ ত্রুটি ছিল না, তবে আমি এখনও প্রচুর পরিমাণে জায়গা নষ্ট করছি। পরবর্তী পদক্ষেপগুলি এটি যত্ন নেওয়া হয়।

  1. স্টার্ট ডকার: systemctl স্টার্ট ডকার

  2. সংরক্ষণ করুন সব চিত্র: Docker $ সংরক্ষণ করুন (Docker চিত্র | sed -e '/ ^ / ডি' -e '/ ^ সংগ্রহস্থলের / ডি' -e এর, [] [] :, '-e এর, [ ]। , ')> / রুট / ডকার.আইএমজি

  3. ডকার আনইনস্টল করুন।

  4. / Var / lib / ডকারে সবকিছু মুছুন: আরএম-আরএফ / ভার / লিবিব / ডকার / [সিডিএনটিভি] *

  5. ডকার পুনরায় ইনস্টল করুন

  6. ডকার সক্ষম করুন: systemctl সক্ষম ডকার

  7. স্টার্ট ডকার: systemctl স্টার্ট ডকার

  8. চিত্রগুলি পুনরুদ্ধার করুন: ডকার লোড </root/docker.img

  9. আপনার চলমান যে কোনও ধ্রুবক পাত্রে শুরু করুন।

এটি আমার ডিস্কের ব্যবহার ock GB জিবি থেকে ডকারের জন্য for জিবি থেকে নামিয়েছে।

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


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 মিনিটে ডিফল্টভাবে চলে runs তবে আপনি এই পতাকাটি কয়েক সেকেন্ডে ব্যবহার করে বিলম্বের সময় সেট করতে পারেন (DELAY_TIME = 1800 বিকল্প)।

আরও বিশদ: https://github.com/meltwater/docker-cleanup/blob/master/README.md


1

যদি আপনি এই ছাঁটাই করা চিত্রগুলি নিজেরাই তৈরি করেন (অন্য কোনও, পুরানো বেস চিত্রগুলি থেকে) দয়া করে উপরের ভিত্তিতে গৃহীত সমাধানগুলি সম্পর্কে সতর্ক থাকুন docker image prune, কারণ আদেশটি অনর্থক এবং আপনার সর্বশেষ চিত্রগুলির দ্বারা প্রয়োজনীয় সমস্ত নির্ভরতাও সরিয়ে দেওয়ার চেষ্টা করবে (কমান্ডটি হওয়া উচিত সম্ভবত নামকরণ করা হয়েছেdocker image*s* prune )।

আমার ডকার ইমেজ বিল্ড পাইপলাইনগুলির জন্য যে সমাধানটি আমি নিয়ে এসেছি (যেখানে দৈনিক বিল্ড এবং ট্যাগগুলি রয়েছে = তারিখগুলি 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

স্প্যারো প্লাগইন ডকার-রিমুভ-ড্যাংলিং-ইমেজ রয়েছে যা আপনি থামানো পাত্রে এবং অব্যবহৃত (ড্যাংলিং) চিত্রগুলি পরিষ্কার করতে ব্যবহার করতে পারেন:

$ sparrow plg run docker-remove-dangling-images

এটি লিনাক্স এবং উইন্ডোজ ওএস উভয়ের জন্যই কাজ করে।


0

প্রথম রান docker images চিত্রগুলির তালিকা দেখতে দৌড়ুন এবং ক্লিপবোর্ডে চিত্র হ্যাশ আইডি অনুলিপি করুন।

চালান docker rmi -f <Image>

মনে রাখবেন বিকল্পটি -fমুছে ফেলা হয়।

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