Script tự động xoá Image không gắn Tag (Untagged) trên Amazon ECR

Vấn đề tràn lưu trữ ECR do các Docker Image cũ không gắn tag (untagged). Bài viết chia sẻ Bash Script giúp tự động dọn dẹp hàng loạt Image untagged trên Amazon ECR.

Script tự động xoá Image không gắn Tag (Untagged) trên Amazon ECR

Trong quá trình triển khai CI/CD với Docker trên AWS, có một vấn đề rất phổ biến mà nhiều anh em gặp phải: Khi chúng ta build và push một Docker Image mới lên Amazon ECR (Elastic Container Registry) với cùng một tag (thường là tag latest), Amazon ECR sẽ gỡ tag đó ra khỏi Image cũ để gắn cho Image mới.

Lúc này, các Image cũ sẽ chuyển sang trạng thái Untagged (không gắn tag). Theo thời gian, hàng trăm Image Untagged này sẽ tích tụ lại, tiêu tốn dung lượng lưu trữ không cần thiết và làm tăng chi phí AWS của bạn một cách vô ích.

Trong bài viết này, TechCoBan sẽ chia sẻ với các bạn một đoạn Bash Script cực kỳ hữu ích giúp tự động loại bỏ hàng loạt các Image không gắn tag này trên ECR một cách nhanh chóng.

1. Yêu cầu chuẩn bị

Để thực thi script, bạn cần có:

  1. Tài khoản AWS: Đã được thiết lập aws cli trên máy cá nhân và cấp quyền (IAM Policy) truy cập vào dịch vụ ECR. (Nếu bạn mới học AWS, bạn hoàn toàn có thể đăng ký tài khoản AWS Free Tier miễn phí).
  2. Bash Shell: Máy tính Linux, macOS hoặc WSL (trên Windows).

Tái hiện lại sự cố (Tuỳ chọn)

Để hiểu rõ cơ chế, bạn có thể thử tạo một Repository trên ECR. Sau đó, liên tục build một Docker image và push lên repository này khoảng 3 lần, tất cả đều dùng chung một tag là latest.

Lúc này, khi vào giao diện quản lý của ECR, bạn sẽ thấy chỉ có Image vừa push lên cuối cùng mang tag latest, còn các Image trước đó đã bị mất tag và hiển thị gạch ngang (Untagged) tại cột Image Tag.

2. Script xoá tự động Images Untagged

Để dọn dẹp hàng loạt các Image rác này, bạn hãy làm theo các bước sau:

Bước 1: Tạo file script

Mở terminal và tạo một file bash script mới:

nano ecr-delete-images-untagged.sh

Bước 2: Dán nội dung script

Mình đã tối ưu lại script giúp nó chạy mượt mà, dễ cấu hình và có log hiển thị rõ ràng hơn. Hãy dán đoạn mã sau vào file:

#!/bin/bash

# ========================================
# CẤU HÌNH AWS
# Thay đổi Region và Profile theo dự án của bạn
# ========================================
AWS_REGION="ap-southeast-1"
AWS_PROFILE="default" 

echo "================================================="
echo "Bắt đầu dọn dẹp các Image UNTAGGED trên Amazon ECR"
echo "Region: $AWS_REGION | Profile: $AWS_PROFILE"
echo "================================================="

# Lấy danh sách toàn bộ Repositories
REPOS=$(aws ecr describe-repositories --region $AWS_REGION --profile $AWS_PROFILE --query 'repositories[].repositoryName' --output text)

for repo in $REPOS; do
  echo "[-] Đang kiểm tra Repository: $repo..."
  
  # Tìm các Image không có tag (UNTAGGED)
  TAGS=$(aws ecr list-images --region $AWS_REGION --profile $AWS_PROFILE --repository-name $repo --filter tagStatus=UNTAGGED --query 'imageIds[].imageDigest' --output text)
  
  if [ -z "$TAGS" ]; then
    echo "    -> Sạch sẽ! Không có Image rác nào."
  else
    for tag in $TAGS; do
      echo "    -> [Xoá] Image Digest: $tag"
      aws ecr batch-delete-image --region $AWS_REGION --profile $AWS_PROFILE --repository-name $repo --image-ids imageDigest=$tag > /dev/null
    done
  fi
done

echo "================================================="
echo "✅ Hoàn tất dọn dẹp!"

Lưu ý: Bạn nhớ thay đổi biến AWS_REGION (ví dụ: ap-southeast-1) và AWS_PROFILE sao cho khớp với cấu hình AWS CLI trên máy của bạn nhé.

Lưu file lại (Bấm Ctrl+O -> Enter -> Ctrl+X).

Bước 3: Cấp quyền thực thi và chạy script

Trước khi có thể gọi file để chạy, bạn cần cấp quyền thực thi (executable) cho file bash này:

chmod +x ecr-delete-images-untagged.sh

Tiến hành chạy script:

./ecr-delete-images-untagged.sh

Script sẽ tự động quét qua toàn bộ các Repository bạn đang có trên ECR, tìm các file có trạng thái UNTAGGED và xoá chúng đi. Màn hình console sẽ hiển thị chi tiết tiến trình dọn dẹp để bạn tiện theo dõi.

3. Tổng kết

Chỉ với một đoạn script ngắn gọn, bạn đã có thể dọn sạch sẽ các file rác sinh ra trong quá trình CI/CD, tiết kiệm không ít tiền lưu trữ cho dịch vụ AWS ECR.

Nếu bạn đang sử dụng Github Actions hay Gitlab CI, bạn hoàn toàn có thể tích hợp trực tiếp script hoặc câu lệnh xoá này vào cuối luồng Pipeline để nó tự động dọn dẹp ngay sau khi Push Image mới lên.

Chúc các bạn thành công! Nếu thấy bài viết hữu ích, đừng quên chia sẻ cho anh em DevOps cùng biết nhé!

Bình luận

Bài viết liên quan