আমি একটি বেসরকারী ডকার রেজিস্ট্রি চালাচ্ছি এবং আমি latest
কোনও সংগ্রহশালা থেকে সমস্ত চিত্র মুছতে চাই । আমি পুরো সংগ্রহস্থল মুছতে চাই না, এর ভিতরে থাকা কয়েকটি চিত্র। এপিআই ডক্স এই কাজ করতে একটি উপায় উল্লেখ না, কিন্তু নিশ্চয় এটা সম্ভব?
আমি একটি বেসরকারী ডকার রেজিস্ট্রি চালাচ্ছি এবং আমি latest
কোনও সংগ্রহশালা থেকে সমস্ত চিত্র মুছতে চাই । আমি পুরো সংগ্রহস্থল মুছতে চাই না, এর ভিতরে থাকা কয়েকটি চিত্র। এপিআই ডক্স এই কাজ করতে একটি উপায় উল্লেখ না, কিন্তু নিশ্চয় এটা সম্ভব?
উত্তর:
বর্তমানে আপনি সেই কাজের জন্য রেজিস্ট্রি এপিআই ব্যবহার করতে পারবেন না। এটি আপনাকে কেবল কোনও সংগ্রহশালা বা একটি নির্দিষ্ট ট্যাগ মুছতে দেয়।
সাধারণভাবে, একটি সংগ্রহস্থল মুছে ফেলার অর্থ, এই রেপো সম্পর্কিত সমস্ত ট্যাগ মুছে ফেলা হয়েছে।
ট্যাগ মুছে ফেলার অর্থ, একটি চিত্র এবং একটি ট্যাগের মধ্যে সংযোগটি মুছে ফেলা হয়েছে।
উপরেরগুলির মধ্যে একটিও একটি চিত্র মুছে ফেলবে না। এগুলি আপনার ডিস্কে রেখে দেওয়া হয়েছে।
এই কর্মপরীক্ষার জন্য আপনার স্থানীয়ভাবে ডকারের চিত্রগুলি সংরক্ষণ করা উচিত।
আপনার সমাধানের জন্য একটি কার্যপ্রণালী হ'ল সর্বশেষ ট্যাগগুলি বাদ দিয়ে সমস্তগুলি মুছে ফেলা এবং এর মাধ্যমে সম্ভাব্যভাবে সম্পর্কিত চিত্রগুলির রেফারেন্সটি সরিয়ে দেওয়া হবে। তারপরে আপনি সমস্ত চিত্রগুলি সরাতে এই স্ক্রিপ্টটি চালাতে পারেন , যা কোনও ট্যাগ বা কোনও ব্যবহৃত চিত্রের পূর্বসূরি দ্বারা রেফারেন্স করা হয় না।
এই হল যেখানে বড় হাতের অক্ষরে (যেমন একটি চিত্র গ্রাফ বিবেচনা করুন A
, B
, ...) সংক্ষিপ্ত চিত্র আইডিগুলি এবং প্রতিনিধিত্ব <-
মানে যে একটি চিত্র অন্য চিত্র উপর ভিত্তি করে:
A <- B <- C <- D
এখন আমরা ছবিতে ট্যাগ যুক্ত:
A <- B <- C <- D
| |
| <version2>
<version1>
এখানে ট্যাগটি <version1>
চিত্রটির উল্লেখ করে C
এবং ট্যাগটি <version2>
চিত্রটির উল্লেখ করে D
।
আপনার প্রশ্নে আপনি বলেছিলেন যে আপনি সরাতে চেয়েছিলেন
সমস্ত চিত্র কিন্তু
latest
। এখন, এই পরিভাষাটি বেশ সঠিক নয়। আপনি ছবি এবং ট্যাগ মিশ্রিত করেছেন। গ্রাফটি দেখে আমি মনে করি আপনি একমত হবেন যে ট্যাগটি <version2>
সর্বশেষ সংস্করণটি উপস্থাপন করে। আসলে, এই প্রশ্ন অনুসারে আপনার কাছে এমন একটি ট্যাগ থাকতে পারে যা সর্বশেষ সংস্করণটি উপস্থাপন করে:
A <- B <- C <- D
| |
| <version2>
| <latest>
<version1>
যেহেতু <latest>
ট্যাগ রেফারেন্স ইমেজটি D
আমি আপনাকে জিজ্ঞাসা করছি: আপনি কি সত্যই চিত্র বাদে সব মুছতে চান D
? সম্ভবত না!
আপনি যদি <version1>
ডকার REST এপিআই ব্যবহার করে ট্যাগটি মুছে ফেলেন তবে আপনি এটি পাবেন:
A <- B <- C <- D
|
<version2>
<latest>
মনে রাখবেন: ডকার কখনই কোনও চিত্র মুছবেন না! এমনকি যদি তা করেও, এই ক্ষেত্রে এটি কোনও চিত্র মুছতে পারে না, যেহেতু চিত্রটি ইমেজটির C
জন্য পূর্বপুরুষের অংশ D
যা ট্যাগ হয়।
এমনকি আপনি যদি এই স্ক্রিপ্টটি ব্যবহার করেন তবে কোনও চিত্র মুছে ফেলা হবে না।
যখন কেউ আপনার রেজিস্ট্রিটিকে টানতে বা ধাক্কা দিতে পারে তখন আপনি নিয়ন্ত্রণ করতে পারেন (যেমন: REST ইন্টারফেস অক্ষম করে)। অন্য কোনও চিত্র যদি এর উপর ভিত্তি করে না থাকে এবং কোনও ট্যাগ এটি উল্লেখ না করে আপনি কোনও চিত্র গ্রাফ থেকে কোনও চিত্র মুছতে পারেন।
লক্ষ্য করুন যে নিম্নলিখিত গ্রাফে, ইমেজ D
হয় না উপর ভিত্তি করে C
কিন্তু উপর B
। সুতরাং, D
উপর নির্ভর করে না C
। আপনি যদি <version1>
এই গ্রাফের ট্যাগ মুছে ফেলেন তবে C
চিত্রটি কোনও চিত্র ব্যবহার করবে না এবং এই স্ক্রিপ্টটি এটি মুছে ফেলতে পারে।
A <- B <--------- D
\ |
\ <version2>
\ <latest>
\ <- C
|
<version1>
পরিষ্কার করার পরে আপনার চিত্রের গ্রাফটি এমন দেখাচ্ছে:
A <- B <- D
|
<version2>
<latest>
এই কমান্ডের সাহায্যে আপনি চান কি?
আমি আমার রেজিস্ট্রি নিয়ে একই সমস্যার মুখোমুখি হয়েছি তখন আমি একটি ব্লগ পৃষ্ঠা থেকে নীচে তালিকাবদ্ধ সমাধানটি চেষ্টা করেছি। এটা কাজ করে।
আপনি এই url এ কল করে আপনার ক্যাটালগগুলি তালিকাভুক্ত করতে পারেন:
http://YourPrivateRegistyIP:5000/v2/_catalog
প্রতিক্রিয়া নিম্নলিখিত বিন্যাসে হবে:
{
"repositories": [
<name>,
...
]
}
আপনি এই url এ কল করে আপনার ক্যাটালগের ট্যাগগুলি তালিকাভুক্ত করতে পারেন:
http://YourPrivateRegistyIP:5000/v2/<name>/tags/list
প্রতিক্রিয়া নিম্নলিখিত বিন্যাসে হবে:
{
"name": <name>,
"tags": [
<tag>,
...
]
}
আপনি এই কমান্ডটি ডকার রেজিস্ট্রি ধারকটিতে চালাতে পারেন:
curl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET http://localhost:5000/v2/<name>/manifests/<tag> 2>&1 | grep Docker-Content-Digest | awk '{print ($3)}'
প্রতিক্রিয়া নিম্নলিখিত বিন্যাসে হবে:
sha256:6de813fb93debd551ea6781e90b02f1f93efab9d882a6cd06bbd96a07188b073
ম্যানিফেস্ট মান সহ নীচে প্রদত্ত কমান্ডটি চালান:
curl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X DELETE http://127.0.0.1:5000/v2/<name>/manifests/sha256:6de813fb93debd551ea6781e90b02f1f93efab9d882a6cd06bbd96a07188b073
আপনার ডকার রেজিস্টি পাত্রে এই কমান্ডটি চালান:
bin/registry garbage-collect /etc/docker/registry/config.yml
এখানে আমার কনফিগারেশন
root@c695814325f4:/etc# cat /etc/docker/registry/config.yml
version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
delete:
enabled: true
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
Deleteing blob: /docker/...
" সম্পর্কে বার্তা সহ তবে এটি ব্যবহৃত ডিস্কের স্থান পরিবর্তন করে না। বিন / রেজিস্ট্রি ব্যবহার করে github.com/docker/dist वितरण v2.4.1 ।
Docker-Content-Digest
অংশ ছোট হাতের (Docker ইঞ্জিন v18.09.2 উপর পরীক্ষা) অর্থাত থাকা উচিতcurl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET http://localhost:5000/v2/<name>/manifests/<tag> 2>&1 | grep docker-content-digest | awk '{print ($3)}'
বর্তমান v2
রেজিস্ট্রি এখন মুছে ফেলা সমর্থন করেDELETE /v2/<name>/manifests/<reference>
দেখুন: https://github.com/docker/dist वितरण/ blob/ master/ docs/ spec/ api.md#deleting-an-image
কাজের ব্যবহার: https://github.com/byrnedo/docker-reg-tool
সম্পাদনা করুন: <reference>
উপরোক্ত প্রকাশটি অনুরোধ করা থেকে পুনরুদ্ধার করা যেতে পারে
GET /v2/<name>/manifests/<tag>
এবং Docker-Content-Digest
প্রতিক্রিয়া শিরোনাম পরীক্ষা করা ।
সম্পাদনা 2: নিম্নলিখিত এনভিও সেট সহ আপনার রেজিস্ট্রি চালাতে হতে পারে:
REGISTRY_STORAGE_DELETE_ENABLED="true"
সম্পাদনা 3: এই ডিস্কের স্থানটি খালি করতে আপনাকে আবর্জনা সংগ্রহ করতে হতে পারে: https://docs.docker.com/registry/garbage-collection/
DELETE
।
{"errors":[{"code":"UNSUPPORTED","message":"The operation is unsupported."}]}
সমস্যা ঘ
আপনি উল্লেখ করেছেন এটি এটি আপনার ব্যক্তিগত ডকার রেজিস্ট্রি ছিল, সুতরাং আপনার সম্ভবত হাব রেজিস্ট্রি এপিআই ডকটির পরিবর্তে রেজিস্ট্রি এপিআই পরীক্ষা করা দরকার , এটি আপনার দেওয়া লিঙ্কটি।
সমস্যা 2
ডকার রেজিস্ট্রি এপিআই একটি ক্লায়েন্ট / সার্ভার প্রোটোকল, এটি ব্যাক-এন্ডে চিত্রগুলি সরিয়ে ফেলতে হবে কিনা তা নিয়ে সার্ভারের প্রয়োগের বিষয়। (আমি অনুমান করি)
DELETE /v1/repositories/(namespace)/(repository)/tags/(tag*)
বিস্তারিত ব্যাখ্যা
আমি ডেমো নীচে এটি আপনার প্রশ্নগুলির জন্য আমার বোঝার হিসাবে আপনার বর্ণনা থেকে এখন কীভাবে কাজ করে।
আপনি প্রাইভেট ডকার রেজিস্ট্রি চালান, আমি ডিফল্ট ব্যবহার করি এবং 5000
বন্দরে শুনি
docker run -d -p 5000:5000 registry
তারপরে আমি স্থানীয় চিত্রটি ট্যাগ করি এবং এটিতে pushোকান।
$ docker tag ubuntu localhost:5000/ubuntu
$ docker push localhost:5000/ubuntu
The push refers to a repository [localhost:5000/ubuntu] (len: 1)
Sending image list
Pushing repository localhost:5000/ubuntu (1 tags)
511136ea3c5a: Image successfully pushed
d7ac5e4f1812: Image successfully pushed
2f4b4d6a4a06: Image successfully pushed
83ff768040a0: Image successfully pushed
6c37f792ddac: Image successfully pushed
e54ca5efa2e9: Image successfully pushed
Pushing tag for rev [e54ca5efa2e9] on {http://localhost:5000/v1/repositories/ubuntu/tags/latest}
এরপরে আপনি রেজিস্ট্রি এপিআই ব্যবহার করতে পারেন এটি আপনার ব্যক্তিগত ডকার রেজিস্ট্রিতে বিদ্যমান আছে তা পরীক্ষা করতে
$ curl -X GET localhost:5000/v1/repositories/ubuntu/tags
{"latest": "e54ca5efa2e962582a223ca9810f7f1b62ea9b5c3975d14a5da79d3bf6020f37"}
এখন আমি সেই এপিআই ব্যবহার করে ট্যাগটি মুছতে পারি !!
$ curl -X DELETE localhost:5000/v1/repositories/ubuntu/tags/latest
true
আবার চেক করুন, ট্যাগটি আপনার ব্যক্তিগত রেজিস্ট্রি সার্ভারে বিদ্যমান নেই
$ curl -X GET localhost:5000/v1/repositories/ubuntu/tags/latest
{"error": "Tag not found"}
registry
চিত্র থেকে চিত্রের ডেটা মোছার উপায় খুঁজছিলাম / করছি । এসএসএইচিং এবং স্ক্রিপ্ট চালানো কাজটি আদর্শ না হলেও। পার্শ্ব নোট হিসাবে আমি এখনও মনে করি এটি একটি অসম্পূর্ণ এপিআই - আপনি ট্যাগগুলি মুছতে পারেন, তবে আপনি পেলে /images
সমস্ত বাম চিত্রের ডেটা দেখতে পাবেন।
এটি সত্যিই কুৎসিত তবে এটি কাজ করে, রেজিস্ট্রিতে পাঠ্য পরীক্ষা করা হয়: 2.5.1 মুছুন সক্ষম করার জন্য কনফিগারেশন আপডেট করার পরেও আমি মুছে ফেলা সহজভাবে পরিচালনা করতে পরিচালনা করি না। আইডিটি পুনরুদ্ধার করা সত্যিই কঠিন ছিল, এটি পেতে লগইন করতে হয়েছিল, কিছুটা ভুল বুঝাবুঝি হতে পারে। যাইহোক, নিম্নলিখিত কাজ করে:
ধারকটিতে লগইন করুন
docker exec -it registry sh
আপনার ধারক এবং ধারক সংস্করণের সাথে মেলে ভেরিয়েবলগুলি সংজ্ঞায়িত করুন:
export NAME="google/cadvisor"
export VERSION="v0.24.1"
রেজিস্ট্রি ডিরেক্টরিতে সরান:
cd /var/lib/registry/docker/registry/v2
আপনার হ্যাশ সম্পর্কিত ফাইলগুলি মুছুন:
find . | grep `ls ./repositories/$NAME/_manifests/tags/$VERSION/index/sha256`| xargs rm -rf $1
প্রকাশগুলি মুছুন:
rm -rf ./repositories/$NAME/_manifests/tags/$VERSION
প্রস্থান
exit
জিসি চালান:
docker exec -it registry bin/registry garbage-collect /etc/docker/registry/config.yml
যদি সমস্ত কিছু সঠিকভাবে করা হয় তবে মুছে ফেলা ব্লবগুলি সম্পর্কে কিছু তথ্য প্রদর্শিত হবে।
কিছু ক্লায়েন্ট রয়েছে (পাইথন, রুবি ইত্যাদিতে) যা ঠিক তা করে। আমার স্বাদ জন্য, আমার রেজিস্ট্রি সার্ভারে একটি রানটাইম (যেমন পাইথন) ইনস্টল করা টেকসই নয়, কেবলমাত্র আমার রেজিস্ট্রি গৃহকর্মের জন্য!
deckschrubber
আমার সমাধানটিও তাই :
go get github.com/fraunhoferfokus/deckschrubber
$GOPATH/bin/deckschrubber
একটি নির্দিষ্ট বয়সের চেয়ে পুরানো চিত্রগুলি স্বয়ংক্রিয়ভাবে মোছা হয়। বয়স ব্যবহার সুনির্দিষ্ট করা যেতে পারে -year
, -month
, -day
, অথবা তাদের সংমিশ্রণ:
$GOPATH/bin/deckschrubber -month 2 -day 13 -registry http://registry:5000
আপডেট : এখানে ডেক্সক্রাব্বরের একটি সংক্ষিপ্ত পরিচিতি ।
deckschrubber
এটি বেশ ভাল - ইনস্টল করা খুব সহজ (একক বাইনারি), এবং আপনাকে বয়সের পাশাপাশি নামের সাথে চিত্রগুলি মুছে ফেলতে দেয় (রেগেক্স ম্যাচের সাথে)।
ERRO[0000] Could not delete image! repo=.... tag=latest
: /
সংক্ষেপে;
1) আপনাকে অবশ্যই একটি ডকার রেপো এর RepoDigests এর জন্য নিম্নলিখিত কমান্ডটি টাইপ করতে হবে;
## docker inspect <registry-host>:<registry-port>/<image-name>:<tag>
> docker inspect 174.24.100.50:8448/example-image:latest
[
{
"Id": "sha256:16c5af74ed970b1671fe095e063e255e0160900a0e12e1f8a93d75afe2fb860c",
"RepoTags": [
"174.24.100.50:8448/example-image:latest",
"example-image:latest"
],
"RepoDigests": [
"174.24.100.50:8448/example-image@sha256:5580b2110c65a1f2567eeacae18a3aec0a31d88d2504aa257a2fecf4f47695e6"
],
...
...
gest {ডাইজেস্ট} = sha256: 5580b2110c65a1f2567eeacae18a3aec0a31d88d2504aa257a2fecf4f47695e6
2) রেজিস্ট্রি REST এপিআই ব্যবহার করুন
##curl -u username:password -vk -X DELETE registry-host>:<registry-port>/v2/<image-name>/manifests/${digest}
>curl -u example-user:example-password -vk -X DELETE http://174.24.100.50:8448/v2/example-image/manifests/sha256:5580b2110c65a1f2567eeacae18a3aec0a31d88d2504aa257a2fecf4f47695e6
একটি সফল প্রার্থনার জন্য আপনার 202 স্বীকৃত হওয়া উচিত।
3-) আবর্জনা সংগ্রাহক চালান
docker exec registry bin/registry garbage-collect --dry-run /etc/docker/registry/config.yml
রেজিস্ট্রি - রেজিস্ট্রি ধারক নাম।
আরও বিশদ ব্যাখ্যার জন্য এখানে লিঙ্ক বিবরণ লিখুন
এই ডকার চিত্রটিতে একটি বাশ স্ক্রিপ্ট রয়েছে যা দূরবর্তী ভি 2 রেজিস্ট্রি থেকে চিত্রগুলি সরাতে ব্যবহার করা যেতে পারে: https://hub.docker.com/r/vidarl/remove_image_from_registry/
বাশ স্ক্রিপ্টের নীচে সাম্প্রতিকতম বাদে রেজিস্ট্রে অবস্থিত সমস্ত ট্যাগ মুছে ফেলে।
for D in /registry-data/docker/registry/v2/repositories/*; do
if [ -d "${D}" ]; then
if [ -z "$(ls -A ${D}/_manifests/tags/)" ]; then
echo ''
else
for R in $(ls -t ${D}/_manifests/tags/ | tail -n +2); do
digest=$(curl -k -I -s -H -X GET http://xx.xx.xx.xx:5000/v2/$(basename ${D})/manifests/${R} -H 'accept: application/vnd.docker.distribution.manifest.v2+json' | grep Docker-Content-Digest | awk '{print $2}' )
url="http://xx.xx.xx.xx:5000/v2/$(basename ${D})/manifests/$digest"
url=${url%$'\r'}
curl -X DELETE -k -I -s $url -H 'accept: application/vnd.docker.distribution.manifest.v2+json'
done
fi
fi
done
এই রান পরে
docker exec $(docker ps | grep registry | awk '{print $1}') /bin/registry garbage-collect /etc/docker/registry/config.yml
এই উত্তরের উপর ভিত্তি করে সরল রুবি লিপি : রেজিস্ট্রি_ক্যালেনার ।
আপনি এটি স্থানীয় মেশিনে চালাতে পারেন:
./registry_cleaner.rb --host=https://registry.exmpl.com --repository=name --tags_count=4
এবং তারপরে রেজিস্ট্রি মেশিনে ব্লবগুলি মুছে ফেলুন /bin/registry garbage-collect /etc/docker/registry/config.yml
।
ইয়াভুজ সার্টের উত্তরের উপর ভিত্তি করে এখানে একটি স্ক্রিপ্ট রয়েছে। এটি সর্বশেষতম সংস্করণ নয় এমন সমস্ত ট্যাগ মুছে ফেলে এবং তাদের ট্যাগটি 950 এর বেশি।
#!/usr/bin/env bash
CheckTag(){
Name=$1
Tag=$2
Skip=0
if [[ "${Tag}" == "latest" ]]; then
Skip=1
fi
if [[ "${Tag}" -ge "950" ]]; then
Skip=1
fi
if [[ "${Skip}" == "1" ]]; then
echo "skip ${Name} ${Tag}"
else
echo "delete ${Name} ${Tag}"
Sha=$(curl -v -s -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET http://127.0.0.1:5000/v2/${Name}/manifests/${Tag} 2>&1 | grep Docker-Content-Digest | awk '{print ($3)}')
Sha="${Sha/$'\r'/}"
curl -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X DELETE "http://127.0.0.1:5000/v2/${Name}/manifests/${Sha}"
fi
}
ScanRepository(){
Name=$1
echo "Repository ${Name}"
curl -s http://127.0.0.1:5000/v2/${Name}/tags/list | jq '.tags[]' |
while IFS=$"\n" read -r line; do
line="${line%\"}"
line="${line#\"}"
CheckTag $Name $line
done
}
JqPath=$(which jq)
if [[ "x${JqPath}" == "x" ]]; then
echo "Couldn't find jq executable."
exit 2
fi
curl -s http://127.0.0.1:5000/v2/_catalog | jq '.repositories[]' |
while IFS=$"\n" read -r line; do
line="${line%\"}"
line="${line#\"}"
ScanRepository $line
done