Cloud و DevOps / راهنمای عملی

بهینه‌سازی Docker Build Cache در CI/CD

روش‌های عملی برای مدیریت Docker Build Cache، کاهش مصرف دیسک Runnerها و جلوگیری از حذف cacheهای موردنیاز در pipelineهای CI/CD.

T
Test ExpertInfrastructure Expert

۷ مهر ۱۴۰۵به‌روزرسانی ۷ مهر ۱۴۰۵3 دقیقهTest Expert

محیط DevOps و مانیتورینگ pipeline برای مدیریت Docker Build Cache
محیط DevOps و مانیتورینگ pipeline برای مدیریت Docker Build Cache
فهرست مقاله

بررسی حجم Docker

در Runnerهای CI/CD، افزایش ناگهانی مصرف دیسک معمولا به cache layerها، imageهای موقت و build contextهای بزرگ مربوط است. قبل از پاکسازی، باید بفهمید کدام بخش بیشترین فضا را مصرف کرده است.

bash
docker system df
docker image ls
docker builder ls

استفاده از docker system df

خروجی docker system df نمای کلی imageها، containerها، volumeها و build cache را نشان می‌دهد. اگر build cache بخش اصلی مصرف دیسک است، پاکسازی کورکورانه imageها مشکل را حل نمی‌کند.

bash
docker system df -v

استفاده از docker buildx du

برای پروژه‌هایی که از BuildKit استفاده می‌کنند، دستور docker buildx du دید دقیق‌تری از cacheها می‌دهد و کمک می‌کند cacheهای سنگین یا بدون استفاده را پیدا کنید.

bash
docker buildx du
docker buildx du --verbose

cache retention strategy

بهترین رویکرد این است که cache را بر اساس سن، فضای مصرفی و نیاز pipeline نگه دارید. در Runnerهای shared، معمولا retention کوتاه‌تر و limit حجمی مشخص بهتر از پاکسازی کامل است.

سیاستکاربردریسک
پاکسازی بر اساس سنRunnerهای پرترافیکممکن است buildهای کم‌تکرار کند شوند
محدودیت حجمیمحیط‌های با دیسک محدودنیازمند پایش منظم
cache اختصاصی branch اصلیrelease pipelineمصرف دیسک بیشتر

پاکسازی cacheهای قدیمی

برای حذف cacheهای قدیمی، از فیلترهای زمانی استفاده کنید تا cacheهای فعال و تازه از بین نروند.

bash
docker builder prune --filter until=168h
docker buildx prune --filter until=168h --force

جلوگیری از حذف cacheهای فعال

اگر pipelineها همزمان اجرا می‌شوند، پاکسازی aggressive می‌تواند buildهای فعال را کند یا ناپایدار کند. زمان‌بندی cleanup باید خارج از ساعات اوج و با lock ساده انجام شود.

نکته: قبل از اجرای prune در Runnerهای مشترک، jobهای فعال و queue را بررسی کنید. پاکسازی cache نباید همزمان با deploy یا release اصلی اجرا شود.
bash
flock -n /tmp/docker-cache-cleanup.lock \
  docker buildx prune --filter until=168h --force

نمونه commandهای واقعی

این نمونه برای cleanup کنترل‌شده در انتهای روز مناسب است. مقدارها باید با اندازه repoها و سرعت build سازمان تنظیم شوند.

bash
#!/usr/bin/env bash
set -euo pipefail

echo "Docker usage before cleanup"
docker system df

docker buildx prune --filter until=168h --force
docker image prune --filter until=240h --force

echo "Docker usage after cleanup"
docker system df

چک‌لیست پایانی

  • حجم cache با docker system df و docker buildx du بررسی شده است.
  • سیاست retention بر اساس سن و حجم تعریف شده است.
  • cleanup با lock اجرا می‌شود.
  • cacheهای مربوط به branchهای مهم حذف نمی‌شوند.
  • زمان اجرای cleanup با release pipeline تداخل ندارد.
  • اثر cleanup روی زمان build اندازه‌گیری شده است.

مشاوره تخصصی

برای بررسی تخصصی زیرساخت و سرویس‌های سازمان خود، با کارشناسان Systechnic مشورت کنید.

درخواست مشاوره
بهینه‌سازی Docker Build Cache در CI/CD