반응형
이 스크립트는 Docker 컨테이너의 /var/lib/docker/overlay2/*/merged/tmp/ 디렉토리에 남아 있는 불필요한 임시 파일을 정리하여 디스크 공간을 확보합니다.
- 지정한 경로에서 큰 디렉토리를 찾아 정리
- 삭제할 디렉토리 개수 및 최소 크기 설정 가능
- 삭제 전후 디스크 사용량 비교 제공
- --dry-run 옵션으로 실제 삭제 없이 미리보기 가능
./cleanup-docker-tmp.sh [옵션]
- -p, --path PATH : 정리할 디렉토리 경로 (기본값: /var/lib/docker/overlay2/*/merged/tmp/)
- -n, --number NUM : 정리할 최대 디렉토리 수 (기본값: 5)
- -s, --size SIZE : 정리할 최소 크기 (예: 10M, 기본값: 0)
- -d, --dry-run : 실제 삭제하지 않고 삭제될 파일만 표시
- -h, --help : 도움말 표시
sudo ./cleanup-docker-tmp.sh -n 10 -s 50M --dry-run
위 명령어는 50MB 이상인 상위 10개의 디렉토리를 찾고, 삭제될 항목을 미리 확인합니다.
- 루트 권한이 필요합니다. (sudo 사용)
- 실제 데이터 손실을 방지하려면 --dry-run 옵션으로 먼저 테스트하세요.
코드 (링크)
https://github.com/pnll/utilities/blob/main/docker-cleanup.sh
utilities/docker-cleanup.sh at main · pnll/utilities
Keeping some code snippets. Contribute to pnll/utilities development by creating an account on GitHub.
github.com
#!/bin/bash
# 크기를 바이트로 변환하는 함수
function convert_to_bytes {
local size=$1
local number=$(echo $size | sed 's/[^0-9.]//g')
local unit=$(echo $size | sed 's/[0-9.]//g')
case "$unit" in
K|k)
echo $(awk "BEGIN {print $number * 1024}")
;;
M|m)
echo $(awk "BEGIN {print $number * 1024 * 1024}")
;;
G|g)
echo $(awk "BEGIN {print $number * 1024 * 1024 * 1024}")
;;
T|t)
echo $(awk "BEGIN {print $number * 1024 * 1024 * 1024 * 1024}")
;;
*)
echo $number
;;
esac
}
# 스크립트 이름과 사용법을 표시하는 함수
function show_usage {
echo "사용법: $0 [옵션]"
echo "옵션:"
echo " -p, --path PATH 정리할 디렉토리 경로 (기본값: /var/lib/docker/overlay2/*/merged/tmp/)"
echo " -n, --number NUM 정리할 최대 디렉토리 수 (기본값: 5)"
echo " -s, --size SIZE 정리할 최소 크기 (예: 10M, 기본값: 0)"
echo " -d, --dry-run 실제 삭제하지 않고 삭제될 파일만 표시"
echo " -h, --help 도움말 표시"
exit 1
}
# 기본 변수 설정
DOCKER_TMP_PATH="/var/lib/docker/overlay2/*/merged/tmp/"
MAX_DIRS=5
MIN_SIZE="0"
DRY_RUN=false
# 명령줄 인자 파싱
while [[ $# -gt 0 ]]; do
case "$1" in
-p|--path)
DOCKER_TMP_PATH="$2"
shift 2
;;
-n|--number)
MAX_DIRS="$2"
shift 2
;;
-s|--size)
MIN_SIZE="$2"
shift 2
;;
-d|--dry-run)
DRY_RUN=true
shift
;;
-h|--help)
show_usage
;;
*)
echo "알 수 없는 옵션: $1"
show_usage
;;
esac
done
# 루트 권한 확인
if [ "$(id -u)" -ne 0 ]; then
echo "이 스크립트는 루트 권한으로 실행해야 합니다."
exit 1
fi
echo "시작 시간: $(date)"
echo "Docker 컨테이너 임시 파일 정리를 시작합니다..."
# 정리 전 디스크 사용량 표시
echo "정리 전 디스크 사용량:"
df -h | grep -E '(Filesystem|/$)'
# 모든 컨테이너의 tmp 디렉토리 반복
for TMP_DIR in $DOCKER_TMP_PATH; do
if [ -d "$TMP_DIR" ]; then
echo "========================================"
echo "디렉토리 정리 중: $TMP_DIR"
# 현재 디렉토리의 큰 파일/폴더 찾기
echo "가장 큰 $MAX_DIRS 개 디렉토리 (최소 크기: $MIN_SIZE):"
LARGE_DIRS=$(find "$TMP_DIR" -mindepth 1 -maxdepth 1 -type d -exec du -sh {} \; 2>/dev/null | sort -rh | head -n "$MAX_DIRS")
echo "$LARGE_DIRS"
# 큰 디렉토리 처리
echo "$LARGE_DIRS" | while read SIZE DIR; do
# 크기가 MIN_SIZE보다 큰지 확인 (사람이 읽기 쉬운 형식을 숫자로 변환)
DIR_SIZE_BYTES=$(convert_to_bytes "$SIZE")
MIN_SIZE_BYTES=$(convert_to_bytes "$MIN_SIZE")
if (( DIR_SIZE_BYTES < MIN_SIZE_BYTES )); then
echo "스킵: $DIR ($SIZE) - 최소 크기 $MIN_SIZE 보다 작음"
continue
fi
echo "처리 중: $DIR ($SIZE)"
if [ "$DRY_RUN" = true ]; then
echo "드라이 런 모드: $DIR/* 파일들이 삭제됩니다."
else
rm -rf "$DIR"/* 2>/dev/null
RESULT=$?
if [ $RESULT -eq 0 ]; then
echo "✓ 성공적으로 삭제되었습니다: $DIR/*"
else
echo "✗ 삭제 중 오류 발생: $DIR/*"
fi
fi
done
fi
done
# 정리 후 디스크 사용량 표시
echo "========================================"
echo "정리 후 디스크 사용량:"
df -h | grep -E '(Filesystem|/$)'
echo "완료 시간: $(date)"
반응형
'Tech : 데이터 분석 > by ChatGPT' 카테고리의 다른 글
(~3/2) 2025 서울리빙디자인페어: 리빙 디자인의 미래를 만나다 (0) | 2025.02.28 |
---|---|
[2025-02-25] 한국은행 기준금리 0.25%p 인하 연 2.75%로 조정 (0) | 2025.02.26 |
[2025-02-05] "서울시의회, 상업·준주거지역 내 비주거시설 비율 완화 추진" 뉴스 분석 (0) | 2025.02.26 |
[Go언어] 맥용으로 빌드한 앱에서 "bad CPU type" 오류 발생 시 해결 방법 (0) | 2025.02.18 |
RStudio 콘솔창에서 폰트컬러를 구분하는 방법 (0) | 2025.02.14 |
댓글