GitHub Actions の「No space left on device」:ディスクを埋めているものを調べ、空け、大きいディスクに移す
GitHub Actions の「No space left on device」は、ジョブがランナーの空きより多く書き込んだという意味で、GitHub の標準の Linux ランナーの空きはおよそ 14 GB です。runner-images のメンテナーは「プライベートでも公開でも、保証する空きは 14GB だけ」と書いています。残りはイメージに入っているツールで、ubuntu-latest のあるユーザーの一覧では Android SDK が 12 GB、ツールキャッシュが 8.5 GB、GHC が 5.5 GB でした。Docker のイメージ、ディスクに展開されたキャッシュ、ビルドの成果物で 14 GB はすぐに埋まります。直すのはこの順です。何がディスクを埋めているかを見る(df -h、df -i、du、docker system df)、書き込みを減らす、使わないプリインストールのツールを消す、それでも収まらなければ大きいディスクで動かす。GitHub の大きいランナーは 75 GB からですが、使えるのは GitHub Team と Enterprise Cloud だけです。
Skipbox は、アカウント専用のマシンでジョブを動かします。ディスクは S で 80 GB、M で 160 GB、L で 320 GB で、定額、実行時間は無制限です。ジョブのあとも残すキャッシュはこのディスクにあり、ディスクが埋まってきたら古いものから減らすので、ジョブの最初に何かを消す必要はありません。
GitHub のランナーのディスク
GitHub ホストランナーの表では、標準の Linux ランナーの SSD はプライベートリポジトリでも公開リポジトリでも 14 GB です。runner-images のディスカッション #9329 では、イメージの変更で Ubuntu ランナーの空きが 31 GB 超から 17 GB 超に減ったあと、メンテナーが「プライベートでも公開でも、保証する空きは 14GB だけ」と答えています。14 GB と考えてください。
残りはイメージです。issue #10386(「Free space left: 72 MB」)で、あるユーザーが ubuntu-latest で du を取った結果です。
| ディレクトリ | 大きさ |
|---|---|
/usr/local/lib/android | 12 GB |
/opt/hostedtoolcache | 8.5 GB(CodeQL だけで 5 GB) |
/usr/local/.ghcup | 5.5 GB |
1. 何がディスクを埋めているかを見る
落ちるステップのあとに、if: always() を付けたステップを足します。
- name: Disk usage
if: always()
run: |
df -h
df -i /
sudo du -xh --max-depth=1 / 2>/dev/null | sort -rh | head -15
docker system df || true
df -hはファイルシステムごとの使用量です。ジョブがどこに書いているか(ワークスペース、/var/lib/dockerの Docker のデータ、一時ディレクトリ)を確かめます。df -iは inode です。バイトが空いていても inode(ファイル 1 つに 1 つ)が尽きると、同じエラーになります。duは大きいディレクトリです。docker system dfは、Docker のイメージ、コンテナ、ボリューム、ビルドキャッシュが使っている量です。
2. 書き込みを減らす
- ビルドの合間に Docker を prune する。
docker system pruneは、止まったコンテナ、使っていないネットワーク、dangling なイメージ、使っていないビルドキャッシュを消します。-aで使っていないイメージすべて、--volumesで匿名ボリュームも消します。 - 効くものだけキャッシュする。 復元したキャッシュはランナーのディスクに展開されるので、大きいアーカイブはダウンロードより多くの場所を取ります。ジョブごとに分けるか、すぐ取り直せるものは外します。
- ビルドの成果物を片づける。 あとのステップで使わないものは、場所が要るステップの前に消します。
3. 使わないプリインストールのツールを消す
issue #2875 と #10386 から。
- name: Free disk space
run: |
sudo rm -rf /usr/local/lib/android /usr/local/.ghcup /opt/hostedtoolcache/CodeQL
sudo rm -rf /usr/share/dotnet /usr/local/share/boost
df -h /
かかるものは 2 つです。次のジョブの VM にはまた入っているので、何 GB も消す時間を毎回払います。そして $AGENT_TOOLSDIRECTORY(ツールキャッシュ全体)を消すともっと空きますが、#2875 を立てた人が書いているとおり、そこにあるはずのツールを使うステップが動かなくなります。free-disk-space のアクションは、こうした削除をまとめたものです。作者はこのスレッドのあとにツールキャッシュを消すオプションを足し、「さらに 6GB 空く」と書いています。
4. 大きいディスクで動かす
| ランナー | ディスク | 使える人 |
|---|---|---|
| GitHub の標準の Linux ランナー | SSD 14 GB、空きはおよそ 14 GB | だれでも |
| GitHub の大きいランナー、2〜96 vCPU | 2 vCPU で 75 GB、4 で 150 GB、8 で 300 GB、最大 2,040 GB(大きいランナー) | GitHub Team と Enterprise Cloud の組織、分課金(大きいランナーについて) |
| セルフホストランナー | 用意した分。ジョブのあとも残すランナーは、だれかが片づけないかぎりイメージと古いワークスペースで埋まっていく | だれでも、運用は自分 |
| Skipbox の専用のマシン | S で 80 GB、M で 160 GB、L で 320 GB、埋まってきたら減らす | 組織と個人アカウント、定額 |
Skipbox がディスクにすること
プランごとに、アカウント専用のマシンが付き、ジョブのあとも残ります。ディスクはマシンの大きさで決まります。
- ディスクは S で 80 GB、M で 160 GB、L で 320 GB です。
- そこに残るのは、あなたのジョブの状態です。 Docker のイメージ、レイヤー、ビルドキャッシュ、
~/.npm、pnpm のストア、~/.cache、Go・Gradle・Maven・Cargo のキャッシュ、setup-*で入れたツール。actions/cacheが保存したものは、ディスクの半分までマシンのそばに残ります。 - 埋まりきりません。 ジョブのあとでディスクが 85% を超えるまでは何も消しません。超えたら、最後に使った日が古いものから 75% まで減らします。dangling なイメージ、Docker のビルドキャッシュ、そしてパッケージのキャッシュと残したビルドを、まるごと消していきます。それでも 85% を超えているときだけ、マシンを作り直します。
- 残すキャッシュとジョブは、同じディスクを使います。 大きなイメージや大きなビルドの成果物など、自分で何十 GB も書くジョブは M か L にします。
| ラベル | マシン | ディスク | プラン |
|---|---|---|---|
skipbox | 4 vCPU・メモリ 16 GB | 80 GB | S、月 6,000 円 |
skipbox-8x16 | 8 vCPU・メモリ 16 GB | 160 GB | M、月 12,000 円 |
skipbox-16x32 | 16 vCPU・メモリ 32 GB | 320 GB | L、月 23,000 円 |
実行時間は無制限です。4 vCPU で月 20,000分なら、GitHub の請求は 参考値:2026年11月10日の為替レート・1ドル=158.22円。米ドルの料金を、このレートで円に換算した概算です。、Skipbox の S は 6,000 円です。
移行は runs-on を 1行書き換えるだけ
jobs:
build:
runs-on: skipbox-8x16 # ubuntu-latest から書き換える
steps:
- uses: actions/checkout@v4
# 「Free disk space」のステップは外せる
- run: docker build -t app .
skipbox-8x16 はプラン M で動きます。runs-on: skipbox は S とトライアルで動きます。
- Skipbox に GitHub でログインする
- Skipbox の GitHub アプリを入れて、使うリポジトリを選ぶ
runs-onを書き換えて push する
セキュリティ
- マシンはアカウントごとの専用です。ほかの会社のジョブと同じマシンで動くことはありません。
- ジョブが終わるたびに、ランナーの認証情報、プロセスとコンテナ、ホームディレクトリの認証情報のファイルを消します。「毎回クリーン」なら、ジョブごとに新しいマシンで動きます。
- 書き込み権限のない人のコード(フォークからのプルリクエストなど)は、使い捨ての VM で動きます。キャッシュは読めますが、書き換えられません。
くわしくはジョブの分離のしくみにあります。
ディスクが足りなくなるジョブで試す
カード不要で、7日間かジョブの合計 3,000分まで無料です。トライアルは runs-on: skipbox で、S と同じ 80 GB のマシンです。ジョブをそこに移し、プリインストールのツールを消すステップを外して動かしてください。
よくある質問
GitHub Actions のランナーのディスクはどのくらい?
GitHub のドキュメントでは、標準の Linux ランナーの SSD はプライベートリポジトリでも公開リポジトリでも 14 GB です。runner-images のメンテナーも、保証する空きはどちらも 14 GB だけだと書いています。ディスクそのものはもっと大きいのですが、残りはランナーのイメージに入っているツールで埋まっているので、14 GB と考えてください。
GitHub Actions で No space left on device が出たら?
まず何が埋めたのかを見ます。df -h でファイルシステムごとの使用量、df -i で inode、sudo du -xh --max-depth=1 / で大きいディレクトリ、docker system df で Docker のイメージとビルドキャッシュです。そのうえで、書き込みを減らし(ビルドの合間に Docker を prune する、効くものだけキャッシュする)、使わないプリインストールのツール(Android SDK、GHC、CodeQL、.NET)を消し、それでも足りなければディスクの大きいランナーで動かします。
ubuntu-latest で何を消せばディスクが空く?
ジョブが使わないツールです。GitHub の runner-images の issue では、/usr/local/lib/android(あるユーザーの一覧で 12 GB)、/usr/local/.ghcup、/opt/hostedtoolcache/CodeQL、/usr/share/dotnet、/usr/local/share/boost を消しています。$AGENT_TOOLSDIRECTORY を消すとツールキャッシュごと空きますが、そこにツールがある前提のセットアップのステップが動かなくなります。何 GB も消すのは、毎回の実行で時間がかかります。
GitHub の大きいランナーはディスクも大きい?
大きいです。2 vCPU で 75 GB、4 vCPU で 150 GB、8 vCPU で 300 GB、64 と 96 vCPU で 2,040 GB まで。ただし使えるのは GitHub Team と GitHub Enterprise Cloud の組織だけで、分課金です。
Skipbox のジョブはディスクをどのくらい使える?
アカウント専用のマシンのディスクは、S で 80 GB、M で 160 GB、L で 320 GB です。ジョブのあとも残すキャッシュも同じディスクにあり、ジョブのあとで 85% を超えていれば、最後に使った日が古いものから 75% まで減らします。セルフホストランナーのディスクのように埋まりきることはありません。自分で何十 GB も書くジョブは M か L にします。
試すのにお金はかかる?
かかりません。カード不要で、7日間かジョブの合計 3,000分まで無料です。S と同じマシンで動きます。ディスクが足りなくなるジョブを runs-on: skipbox にして、プリインストールのツールを消すステップを外してください。
2026年11月13日 更新