Simple Docker Registry Cleaner เขียนใน Python ที่ใช้ Docker Registry HTTP API V2
Docker Registry Cleaner เป็นแอปพลิเคชันบรรทัดคำสั่งที่ออกแบบมาเพื่อทำความสะอาดภาพนักเทียบท่าเก่าโดยอัตโนมัติจากรีจิสทรี Docker มันมีวิธีที่ยืดหยุ่นและกำหนดค่าได้ในการกำหนดงานทำความสะอาดตามเกณฑ์ต่างๆ
Docker Registry Cleaner สามารถติดตั้งและทำงานได้โดยใช้ Python 3.11 หรือสูงกว่า ทำตามขั้นตอนด้านล่างเพื่อติดตั้งและเรียกใช้แอปพลิเคชัน:
โคลนที่เก็บหรือดาวน์โหลดซอร์สโค้ดจากที่เก็บ GitHub
ติดตั้งการพึ่งพาที่ต้องการโดยเรียกใช้คำสั่งต่อไปนี้หรือเพียงแค่ใช้เครื่องมือ Pipenv :
pip install -r requirements.txt
การพึ่งพาทั้งหมดรวมถึง dev
pip install -r requirements.all.txt
เครื่องทำความสะอาดรีจิสทรี Docker ต้องใช้ 3 ไฟล์การกำหนดค่า: config/config.yaml , config/jobs.yaml และ config/manual.yaml
ตัวอย่างสามารถพบได้ในที่เก็บข้อมูล
Exmaple:
# Your docker registry url.
registry_url : https://your.registry.com/
# Environment variables works only for username, password and proxy
# Format: <field>: "__ENV: <YOUR_ENV_NAME>"
# or you can use strings
# username: your_username
username : " __ENV: ENV_VAR_NAME "
password : " __ENV: ENV_VAR_NAME2 "
# Optional; Format: <scheme>://[username:password@]<address>[:port]
proxy : " __ENV: PROXY "
# Optional, default 20, max 120, min 1
timeout : 20
# Optional; default 20
max_concurrent_requests : 20registry_url : URL ของ Docker Registry ที่จะทำความสะอาดusername : ชื่อผู้ใช้ที่ใช้สำหรับการรับรองความถูกต้องกับ Docker Registrypassword : รหัสผ่านที่ใช้สำหรับการรับรองความถูกต้องกับ Docker Registrymax_concurrent_requests : จำนวนสูงสุดของคำขอพร้อมกันที่แอปพลิเคชันสามารถทำกับรีจิสทรีได้ ค่าเริ่มต้น: 20.proxy : URL ของพร็อกซีเซิร์ฟเวอร์ที่จะใช้สำหรับการร้องขอไปยังรีจิสทรี หากไม่จำเป็นให้ว่างเปล่าหรือลบtimeout : หมดเวลาสำหรับคำขอ HTTP แต่ละครั้งในไม่กี่วินาที ค่าเริ่มต้น: 20.username registry และ proxy สามารถตั้งค่าได้โดยใช้ตัวแปรสภาพแวดล้อมดังแสดงในตัวอย่าง รายการงานทำความสะอาดที่กำหนดไว้ใน jobs.yaml แต่ละงานถูกกำหนดโดยพารามิเตอร์ต่อไปนี้:
- name : clean-dev-tags
# Optional
description : Clean dev tags every 24 hours
# List of repositories to clean
# You can use regular expression to match multiple repositories
# Format: r/regexp/
repositories :
- r/^base-w+$/
- scheduler-dev
- admin-panel-dev
# Pythonic regular expressions to match the tag name
# Be careful using this. Check your regexp at https://regex101.com/
tag_regexps :
- v5.d+.d+-dev$
- develop-[dw]+$
# Do not delete the last n tags, even
# if they are older than the specified number of days
save_last : 5
# Perform checks and do cleanup every x hours
clean_every_n_hours : 24
# Delete tags if their creation date is older than y days
older_than_days : 5name : ชื่อของงานdescription : คำอธิบายเพิ่มเติมเกี่ยวกับงานrepositories : สตริงอาร์เรย์ของชื่อที่เก็บ regexps และชื่อเพื่อทำความสะอาดภาพจากtag_regexps : สตริงอาร์เรย์ของนิพจน์ปกติเพื่อจับคู่แท็กในที่เก็บ แท็กเฉพาะการจับคู่รูปแบบ regex เหล่านี้เท่านั้นที่จะได้รับการพิจารณาสำหรับการทำความสะอาด ระวังเมื่อคุณใช้ตัวเลือกนี้ ตรวจสอบ regexp ของคุณที่ https://regex101.com/save_last : จำนวนแท็กสุดท้ายที่จะบันทึก (ไม่รวมออกจากการล้างข้อมูล) ในแต่ละที่เก็บclean_every_n_hours : ช่วงเวลาเป็นชั่วโมงระหว่างการทำความสะอาดอย่างต่อเนื่องสำหรับงานนี้older_than_days : อายุในไม่กี่วันหลังจากที่แท็กจะได้รับการพิจารณาสำหรับการทำความสะอาด แท็กถูกจัดกลุ่มโดยนิพจน์ทั่วไปโดยมีนิพจน์ทั่วไปแต่ละอันแสดงถึงกลุ่มที่แตกต่างกัน หากคุณต้องการบันทึก 5 แท็กสุดท้ายสำหรับทั้ง release-xx-dev และ release-xx อย่างอิสระ แต่นิพจน์ทั่วไปของคุณสามารถจับคู่แท็กทั้งสองประเภทได้คุณจะจบลงด้วยอาร์เรย์ผสมที่มีแท็กทั้ง release-xx-dev และ release-xx 5 รายการ เพื่อป้องกันสถานการณ์นี้คุณจะต้องเพิ่มการแสดงออกปกติสองแบบที่แตกต่างกันเพื่อจับ release-xx และ release-xx-dev อย่างอิสระ
ความแตกต่างจาก jobs.yaml :
--jobs เท่านั้นซึ่งช่วยให้คุณสามารถระบุงานที่ประกาศใน manual.yamlใช้คำสั่งต่อไปนี้เพื่อเรียกใช้เครื่องทำความสะอาดรีจิสทรี Docker:
python main.py [OPTIONS]
$ python -h
usage: main.py [-h] [--debug] [--watch] [--jobs JOBS [JOBS ...]] [--http-logs]
Automatic cleaner of old docker images
options:
-h, --help show this help message and exit
--debug The application will generate logs without actually deleting the images
--watch Endless operation of the application for auto cleanup. Will be used 'config.yaml'
--jobs JOBS [JOBS ...]
List of jobs in `manual.yaml` to run. Example: --jobs clean-dev-tags clean-prod-older-15
--http-logs Enable http logs for every request
เครื่องทำความสะอาดรีจิสทรี Docker ยอมรับตัวเลือกต่อไปนี้:
--debug : หากมีให้แอปพลิเคชันจะสร้างบันทึกโดยไม่ต้องลบภาพจริง ๆ ใช้ตัวเลือกนี้หากคุณต้องการตรวจสอบรูปภาพแอปจะลบ--watch : หากมีให้แอปพลิเคชันจะทำงานในวงวนที่ไม่มีที่สิ้นสุดการดำเนินงานการล้างข้อมูลตามการกำหนดค่าใน config.yaml เป็นระยะ--jobs : รายการชื่องานที่กำหนดไว้ในคู่มือ yaml ที่คุณต้องการเรียกใช้ ตัวอย่างเช่น: --jobs clean-dev-tags clean-prod-older-15--http-logs : หากมีให้บันทึก HTTP จะเปิดใช้งานสำหรับทุกคำขอที่ทำโดยแอปพลิเคชัน หากคุณใช้แอปพลิเคชันกับตัวเลือก --debug และจำเป็นต้องเรียกกระบวนการล้างข้อมูลทันทีคุณอาจต้องทำความสะอาดไฟล์ latest_cleanup.json หรือลบส่วนเฉพาะที่มีผลงานที่คุณสนใจการดำเนินการขั้นตอนนี้จะช่วยให้คุณทำการล้างข้อมูลต่อไปทันทีโดยไม่ต้องรอ
หลังจากเรียกใช้แอปพลิเคชันในโหมด --debug แล้วคุณต้องหยุดแอปพลิเคชันด้วย Ctrl + C แล้วรีสตาร์ทโดยไม่ต้องตัวเลือก --debug เพื่อกลับมาใช้กระบวนการทำความสะอาดปกติ
logs/cleaner.logcache/history.logcache/latest_cleanup.json ที่เก็บนี้มี Dockerfiles สองตัวที่อยู่ในไดเรกทอรีราก: Dockerfile ขึ้นอยู่กับ Alpine Linux และ Dockerfile.bullseye ตาม Debian 11
คอนเทนเนอร์ Docker ทั้งสองได้รับการออกแบบมาเพื่อเรียกใช้คำสั่งเดียวกัน: python3 main.py --watch --http-logs ซึ่งเริ่มกระบวนการล้างข้อมูลในลูปที่ไม่มีที่สิ้นสุด เมื่อเริ่มต้นแล้วคอนเทนเนอร์จะดำเนินการต่อไปอย่างไม่มีกำหนดโดยไม่ต้องแทรกแซงเพิ่มเติม การตั้งค่านี้ช่วยให้มั่นใจได้ว่ากระบวนการล้างข้อมูลที่ราบรื่นและต่อเนื่องสำหรับภาพนักเทียบท่า
อัลไพน์:
docker build -t cleaner:alpine .
Debian:
docker build -t cleaner:debian -f Dockerfile.bullseye .
ในการเรียกใช้เครื่องทำความสะอาดรีจิสทรี Docker คุณจะต้องจัดเตรียมตัวแปรสภาพแวดล้อมที่จำเป็นสำหรับการรับรองความถูกต้องและหากจำเป็นต้องติดตั้งไฟล์การกำหนดค่าใหม่ภายในคอนเทนเนอร์:
docker run
-v ./config/config.yaml:/app/config/config.yaml
-v ./config/jobs.yaml:/app/config/jobs.yaml
cleaner
หยุด:
docker container stop <container_name> -s KILL