概要
ローカル環境でテストのためにDockerコンテナ起動したり閉じたりを繰り返していたら、以下のエラーに。こちらの原因と解決方法を紹介します。
failed to solve: failed to copy files: copy file range failed: no space left on device
原因
デバイスにスペースがないよ、と言われていますね。
まずはDockerの利用状況を確認。
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 60 0 34.78GB 34.78GB (100%)
Containers 0 0 0B 0B
Local Volumes 11 0 1.211GB 1.211GB (100%)
Build Cache 565 0 20.95GB 20.95GB
Docker Desktopのextension「Desk usage」でも確認できます
(なぜかTotal Sizeにずれがあるけどタイムラグがあるのだろうか...updateしたら治りそう)
Dockerの上限は、ホストマシンのディスク容量にも依存しますので、まずはホストマシンのストレージ使用状況を確認(dockerデーモンでも制限設定はできるみたい)。
コマンドでも確認できますし、「システム情報」→「ストレージ」でも利用可能容量がわかります。
確認すると、、残り5.8GBしか使えない状態だった...
そもそもストレージが残りわずか、というのも、Dockerで不要なファイルが多く一気に増えていたからかも。
ということで、私は念の為DockerDesktopから目視で削除していきます。
めちゃたまってる...
上記のnoneと出ているものは明らかに不要だったので削除。
もう一度利用状況を確認すると、だいぶ減ったことがわかります。
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 39 0 15.46GB 15.46GB (100%)
Containers 0 0 0B 0B
Local Volumes 11 0 1.211GB 1.211GB (100%)
Build Cache 267 0 21.15GB 21.15GB
Macホストマシンのストレージをみても、利用可能容量が32GBになったことを確認。
この状態でdocker compose up -d
を行うと、無事にイメージ作成ができました。
ビルドキャッシュも削除!
後に、ビルドキャッシュも削除しました。
$ docker builder prune
WARNING! This will remove all dangling build cache. Are you sure you want to continue? [y/N] y
ビルドキャッシュとは、Docker イメージのビルド時に作成される一時的なキャッシュのこと。これらがあることで、以前ビルドしたステップが迅速に実行されたり、コンテナイメージの再現性が確保されたり、色々メリットはあるらしい。とはいえ、今回の削除対象は「未参照("dangling"
)」のものであって、もう使われていないもの。
20GBもあったので、もういいや!と思って削除したのですが、その後にイメージ再作成などの操作を行うと、以前より遅いような...余計なものまで消してしまったのだろうか(結果7GBは残っているので使っているキャッシュは残っていそうなのですが)。気のせいだと祈ろう。