dockerでno space left on deviceが出た時の対処法

docker

概要

  • no space left on deviceは、日本語訳すると「空きディスク容量がありません」ということです。まずは、OS自体のディスク容量不足をまずはチェックします。
  • OSのディスク容量が空いているのに、no space left on deviceが表示された場合はDocker自体に割り当てられたディスク容量が枯渇したことが原因です。
  • 例えば、Docker for Macは20GB分しか確保しないです。
  • 普通にDockerを利用しているとゴミデータが溜まっていくので、不要なデータを消していきます。
  • 下に行けば下に行くほど、重要なデータを消していくことになりますのでご注意ください。

0. 割当領域の拡張

macOSであれば以下のような設定画面から、割り当てているディスク容量の変更を行えます。設定を変更後はDockerの再起動が必要になります。

そもそも、自分が思っている以上にDockerがディスクを消費していると感じる場合は、以降にあるような手順でゴミファイルの削除を進めて行ってください。

1. ゴミ掃除

まずは、名前が割り振られていない仮想ディスクを削除します。

GUIから行う場合

Docker Desktopから簡単に行なえます。

danglingなコンテナはほとんど再利用することはないので消してしまっても問題はほとんど起きないと思います。

CLIから行う場合

dockerコマンドのdanglingフィルタはコンテナから参照されていない(dangling=宙ぶらりんな)ボリュームに一致します。

$ docker volume rm $(docker volume ls -qf dangling=true)

次に、1週間以上使っていないコンテナの削除をします。以下の例では1週間使っていないコンテナを削除します。

$ docker container prune --force --filter "until=168h"

次に、1週間以上前に停止したコンテナの削除です。

$ docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs docker rm

全コンテナの削除をします。

$ docker rm $(docker ps -aq)

dangilingなimageを一括削除する。

Dangilingなimageとは、Dockerfileから作ってタグを打っていないimageです。

基本的に再利用することはないので消してOKです。普通の利用方法をしていればイメージはDockerfileから再生成できます。docker-composeから作ったり、tagが打ってあるイメージは消えません。

$ docker rmi $(docker images -f "dangling=true" -q)

次に、全イメージを削除します。imageが全部消えます。関連しているコンテナがまだ存在している場合はエラーが表示されて消えません。以下の2つのコマンドはほぼ同義です。

$ docker rmi $(docker images -q)
$ docker image prune

全ての停止中のコンテナ、ボリューム、ネットワーク、イメージを一括削除するコマンドです。ほぼDockerのリセットと同義です。

$ docker system prune 

2. ディスクイメージの再構築

Docker version 20.10.22では、Docker Desktopから行えます。

(これは、macosだけかも)

qemuをインストール。

$ brew install qemu
$ cd ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux
$ mv Docker.qcow2 Docker.qcow2.original
$ du -hs Docker.qcow2.original
12G     Docker.qcow2.original
$ qemu-img convert -O qcow2 Docker.qcow2.original Docker.qcow2
$ du -hs Docker.qcow2
772M    Docker.qcow2
$ rm Docker.qcow2.original

source: https://github.com/docker/for-mac/issues/371#issuecomment-242047368

私の場合、これでは19GBから18GBに減っただけでした。

% ls -l Docker.qcow2*
-rw-r--r--  1 yuki_matsukura  staff  19443286016 Mar 14 10:31 Docker.qcow2
-rw-r--r--  1 yuki_matsukura  staff  20844183552 Mar 14 10:30 Docker.qcow2.original

3. ディスクイメージの拡張

Docker version 20.10.22では、Docker Desktopから行えます。

そもそも20GBしか確保してくれないのは少ないので。

% qemu-img info Docker.qcow2
image: Docker.qcow2
file format: qcow2
virtual size: 64G (68719476736 bytes)
disk size: 18G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false

% qemu-img resize Docker.qcow2 +10G
Image resized.

% qemu-img info Docker.qcow2
image: Docker.qcow2
file format: qcow2
virtual size: 74G (79456894976 bytes)
disk size: 18G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false

4. 設定ファイル書き換え

Docker version 20.10.22では、Docker Desktopから行えます。

(Docker 17で変わらなかった。)

~/.docker/machine/machines/default/config.jsonを開いて、DiskSizeを20000から大きい値に変更。

参考資料

Docker実践ガイド 第2版 impress top gearシリーズ
Amazonで古賀 政純のDocker実践ガイド 第2版 impress top gearシリーズ。アマゾンならポイント還元本が多数。一度購入いただいた電子書籍は、KindleおよびFire端末、スマートフォンやタブレットなど、様々な端末で...

コメント