cat posts/%e3%80%90%e6%82%b2%e5%a0%b1%e3%80%91%e3%83%af%e3%82%a4%e3%81%ae%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%80%81docker-%e3%81%ae%e3%83%93%e3%83%ab%e3%83%89%e3%82%ad%e3%83%a3%e3%83%83%e3%82%b7%e3%83%a5.md

【悲報】ワイのサーバー、Docker のビルドキャッシュが81GBに肥大してディスク80%になっていた

1 風吹けば名無し 2026/10/12(月) 21:09:36 ID:aB3xK9m0
ワイ「ディスク使用率80%て…何が食っとるんや」
docker system df 叩いたらビルドキャッシュが81GB
誰も掃除してなかったんやなコレ

2 風吹けば名無し 2026/10/12(月) 21:10:03 ID:Qz7LpR2d
>>1 81GBは草
docker system prune -a -f をcronに入れとけばええやん

3 風吹けば名無し 2026/10/12(月) 21:10:33 ID:aB3xK9m0
>>2 それが一番やったらアカンやつやで
ワイ最初それ考えたけど怖くて踏みとどまったんや

4 風吹けば名無し 2026/10/12(月) 21:11:06 ID:mN4vTe8s
>>3 なんでや 掃除スクリプトなんやから全部消してなんぼやろ

5 風吹けば名無し 2026/10/12(月) 21:11:27 ID:aB3xK9m0
>>4 実はこのサーバー、compose の profile や CI からしか参照されない現役イメージがあるんや
wordpress:cli-2.10.0-php8.3 とかな
image prune -a は「コンテナに使われてないイメージ」を全部消すから巻き添えになるやで

6 風吹けば名無し 2026/10/12(月) 21:11:51 ID:Yc1HwU5j
>>5 ファッ!? 使ってないように見えて使ってるやつやんけ

7 風吹けば名無し 2026/10/12(月) 21:12:18 ID:aB3xK9m0
>>6 せや 常駐してないだけで必要なやつや
しかも docker volume prune はもっとヤバい
task_demo の DB に実アカウントの実データが入っとるんや

8 風吹けば名無し 2026/10/12(月) 21:12:48 ID:Qz7LpR2d
>>7 volume prune は絶対あかんやつで草
で、結局どう消したんや

9 風吹けば名無し 2026/10/12(月) 21:13:21 ID:aB3xK9m0
>>8 消す範囲を絞ったで
ビルドキャッシュは古いものだけ、イメージはタグなしだけ、コンテナは停止済みの古いものだけや
KEEP_HOURS の既定は168時間(7日)にしたで

docker builder prune --force --filter "until=168h"   # 7日より古いビルドキャッシュだけ
docker image prune --force                            # -a なし。タグなし(dangling)のみ
docker container prune --force --filter "until=168h"

10 風吹けば名無し 2026/10/12(月) 21:13:42 ID:mN4vTe8s
>>9 ええやん でもいきなり本番で消すのは怖いんやが

11 風吹けば名無し 2026/10/12(月) 21:14:06 ID:aB3xK9m0
>>10 それがヤマ場で、まさに怖かったから既定をドライランにしたんや
–apply を付けた時だけ実際に消す
ドライランは消さずに回収可能量と件数だけログに出すで

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

APPLY=0
[ "${1:-}" = "--apply" ] && APPLY=1

# ./docker-cleanup.sh          # ドライラン(既定。何も削除しない)
# ./docker-cleanup.sh --apply  # 実際に削除する

12 風吹けば名無し 2026/10/12(月) 21:14:33 ID:Yc1HwU5j
>>11 ええ設計やん
で、タイトルのvscode-serverは何やねん

13 風吹けば名無し 2026/10/12(月) 21:15:03 ID:aB3xK9m0
>>12 ついでに VS Code Server も溜まっとってな
–enable-remote-auto-shutdown が効かんくて、古いセッションが積み上がるんや
アイドルなセッションだけ止める vscode-server-cleanup.sh も書いたで

14 風吹けば名無し 2026/10/12(月) 21:15:36 ID:Qz7LpR2d
>>13 現役セッション殺したら泣くやろ そこはどうしたんや

15 風吹けば名無し 2026/10/12(月) 21:15:57 ID:aB3xK9m0
>>14 安全装置を4つ入れたで
1. ログ最終更新が IDLE_HOURS(既定24h)以内なら触らん
2. 一番新しく動いたセッションは常に除外
3. ログディレクトリが特定できんやつは触らん
4. IDLE_HOURS以内に起動した子プロセスがあれば作業中とみなして保持
判断つかんものは触らん方針や

# 子孫プロセスの引数から --logsPath を探す
d=$(tr '\0' '\n' < "/proc/$k/cmdline" 2>/dev/null | grep -A1 -x -- '--logsPath' | tail -1)

# ログディレクトリが特定できないセッションは触らない
log "  [保持] PID $pid : ログディレクトリを特定できず(安全側に倒して保持)"

16 風吹けば名無し 2026/10/12(月) 21:16:21 ID:aB3xK9m0
>>15 掃除スクリプトで一番大事なのは「何を消すか」より「何を消さないか」やと思い知ったわ
消さない側はコメントで明文化して、実装もせんようにしたで

# 以下は意図的に実装していない
# docker volume prune     # DBの実データが入っているボリュームを巻き込む
# docker image prune -a   # compose の profile / CI からしか参照されない現役イメージが消える

17 風吹けば名無し 2026/10/12(月) 21:16:48 ID:Yc1HwU5j
>>16 ワイもcronに prune -a 仕込んどったわ…今夜見直すで

18 風吹けば名無し 2026/10/12(月) 21:17:18 ID:aB3xK9m0
>>17 定期的に掃除する仕組みは、消さない物を決めてから作るのが先やで