← 글 목록

notes

Docker - cron 을 이용하여 docker history 기간 지정하여 지우기

cron으로 Docker history를 기간 기준 삭제하는 자동 정리 방법 메모.

  • 빌드 서버에 쌓이는 이미지와 캐시를 cron으로 매일 새벽 3시에 정리한다.
  • --filter "until=72h"로 사흘 지난 것만 지워서 최근 이미지는 남긴다.
  • 볼륨에는 until 필터가 안 먹어서 볼륨은 따로 손으로 지운다.

도커 빌드를 반복하면 안 쓰는 캐시·컨테이너·이미지가 쌓인다. 지금은 Jenkins → SSH 전송 후 → 서버에서 docker build를 돌리는 흐름이라, 파이프라인 스크립트 끝에 매번 prune을 넣기보다 주기적으로 지우는 매크로를 두는 쪽이 맞다고 봤다. systemd timer 버전은 auto clean 글에 있고, 여기는 cron과 쉘 스크립트 버전.

처음엔 무작정 docker system prune -a를 돌렸는데, 방금 빌드한 이미지 캐시까지 날아가서 다음 빌드가 처음부터 다시 도는 게 아까웠다. 그래서 제목처럼 기간을 정해서, 일정 시간이 지난 것만 지우도록 바꿨다.

기간을 정해서 지우는 스크립트

핵심은 --filter "until=기간"이다. 지정한 시간보다 오래전에 만들어진 것만 지운다. 값은 Go duration 형식이라 d(일) 단위가 없다. 7일은 168h로 써야 한다.

하나 걸린 게 있는데, docker system prune --volumes에 until을 같이 주면 The "until" filter is not supported with "--volumes" 에러가 난다. 볼륨은 생성 시간으로 거르는 필터가 없어서다. 그래서 system prune 한 방 대신 대상별로 나눠서 돌리고, 볼륨은 아예 건드리지 않았다.

#!/bin/bash
# /opt/scripts/cleanup.sh
KEEP="72h"
LOG=/var/log/docker-cleanup.log

echo "$(date '+%F %T') start (until=$KEEP)" >> $LOG
docker container prune -f  --filter "until=$KEEP" >> $LOG 2>&1
docker image prune -af     --filter "until=$KEEP" >> $LOG 2>&1
docker builder prune -af   --filter "until=$KEEP" >> $LOG 2>&1
df -h / | tail -1 >> $LOG
echo "$(date '+%F %T') done" >> $LOG

마지막에 df 한 줄을 넣어 둔 건 로그만 봐도 디스크가 얼마나 남았는지 보려고다.

예전에 쓰던 통째 삭제 버전
#!/bin/bash
echo "$(date): Starting Docker cleanup" >> /var/log/docker-cleanup.log
docker system prune -a --volumes -f >> /var/log/docker-cleanup.log 2>&1
echo "$(date): Docker cleanup completed" >> /var/log/docker-cleanup.log

기간 구분 없이 안 쓰는 건 전부, 볼륨까지 지운다. 스테이징처럼 날아가도 상관없는 서버에서만 쓴다.

chmod +x /path/to/cleanup.sh

--volumes는 안 쓰는 볼륨까지 지운다. DB named volume이 있는 서버면 빼거나, 스택이 내려가 있을 때 돌리지 말 것.

crontab

cron은 로그인 셸과 환경이 달라서 PATH가 짧다. 스크립트는 절대경로로 적고, docker 명령을 못 찾으면 crontab 맨 위에 PATH를 적어 준다. docker 그룹에 없는 계정이면 sudo crontab -e로 root 쪽에 등록한다.

crontab -e
# 매일 새벽 3시
0 3 * * * /path/to/cleanup.sh

# 또는 6시간마다
0 */6 * * * /path/to/cleanup.sh

로그 확인과 수동 정리

얼마나 쌓여 있는지는 docker system df로 먼저 본다. RECLAIMABLE 칸이 지금 지울 수 있는 용량이다.

tail -f /var/log/docker-cleanup.log

# 전부 (주의)
docker system prune -a --volumes

# 빌드 캐시만
docker builder prune

# 이미지만
docker image prune -a

# 중지 컨테이너만
docker container prune

타이머로 관리하고 싶으면 Docker - auto clean 쪽 systemd 설정을 쓴다. 둘 다 켜 두면 같은 날 두 번 도는 일도 있으니 하나만 고른다.