できない.dev

docker build で「no space left on device」が出てビルドできない

BuildKit のキャッシュ層や停止中コンテナ、dangling ボリュームが溜まるとビルドストレージが枯渇する。
docker system df で内訳を見て docker builder prune / docker system prune で掃除、Docker Desktop は仮想ディスク上限を引き上げる。

#docker#build#disk#prune#buildkit

要約

no space left on device の多くは BuildKit のキャッシュ層未使用イメージ・ボリューム が溜まったことが原因。docker system df で内訳を確認し、docker builder prune / docker system prune --volumes で削る。
Docker Desktop は仮想ディスク自体の上限に当たっている場合があるので、設定でサイズを引き上げる。

よくある原因

  1. BuildKit キャッシュの肥大化: マルチステージビルドや CI を繰り返すと buildx のキャッシュレイヤが GB 級に膨らむ。
  2. 停止コンテナ・dangling イメージ: docker compose up を何度も使い回し、停止コンテナや未参照イメージが残り続けている。
  3. Docker Desktop の仮想ディスク上限: macOS / Windows の Docker Desktop は仮想ディスクで動くため、ホスト側ストレージに余裕があっても先に仮想ディスクが詰まる。
  4. /var/lib/docker が OS と同居: Linux ホストで /var/lib/docker/ と同パーティションだと、OS ログや他用途のファイルと容量を取り合う。

解決策

1. 内訳を確認する

docker system df -v

Build Cache / Images / Containers / Local Volumes のどれが太っているかを把握する(公式の Prune ガイド)。

2. キャッシュを削る

docker builder prune -af                # BuildKit のビルドキャッシュ全削除
docker system prune -af --volumes       # 停止コンテナ・未使用イメージ・dangling ボリュームを一括

-a は使われていないイメージも対象、--volumes は dangling ボリュームを含む。
本番運用環境ではボリュームの扱いに注意。buildx prune の公式 も合わせて確認。

3. Docker Desktop の仮想ディスクを広げる

Settings → Resources → Disk image size を実用値(例 128GB)に上げて Apply & Restart。
狭いままだと prune してもすぐ詰まる。

4. data-root を別パーティションに移す

Linux ホストでは /etc/docker/daemon.json に書く:

{ "data-root": "/mnt/docker-data" }

systemctl restart docker で反映。
既存イメージは引き継がず作り直す。

この記事は役立ちましたか?