docker for macで No space left on device



## 結論

二つ解決策がある。

1. 以下のコマンドで不要なimage containerを削除してあげる。

以下のコマンドを打つと、まとめて削除してくれます。

```shell

$ docker system prune
```

消す方法は、たくさんあるので以下の記事が参考になると思います。

参考： https://qiita.com/shinespark/items/526b70b5f0b1ac643ba0


2. 以下の画像の仮想環境のディスクサイズを上げる。

<img width="967" alt="Settings.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150144/bdbba37e-e3f7-ac4e-60a8-8081f068d018.png">


## 詳細

### エラー内容
docker-composeで、Elasticsearchを立ち上げようとすると、以下のようなエラーが出るので、その対処方法を記載していきます。

```shell

org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: Unable to access 'path.scripts' (/usr/share/elasticsearch/config/scripts)
	at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:125) ~[elasticsearch-5.2.2.jar:5.2.2]
	at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:112) ~[elasticsearch-5.2.2.jar:5.2.2]
	at org.elasticsearch.cli.SettingCommand.execute(SettingCommand.java:54) ~[elasticsearch-5.2.2.jar:5.2.2]
	at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:122) ~[elasticsearch-5.2.2.jar:5.2.2]
	at org.elasticsearch.cli.Command.main(Command.java:88) ~[elasticsearch-5.2.2.jar:5.2.2]
	at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:89) ~[elasticsearch-5.2.2.jar:5.2.2]
	at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:82) ~[elasticsearch-5.2.2.jar:5.2.2]
Caused by: java.lang.IllegalStateException: Unable to access 'path.scripts' (/usr/share/elasticsearch/config/scripts)
	at org.elasticsearch.bootstrap.Security.addPath(Security.java:379) ~[elasticsearch-5.2.2.jar:5.2.2]
	at org.elasticsearch.bootstrap.Security.addFilePermissions(Security.java:251) ~[elasticsearch-5.2.2.jar:5.2.2]
	at org.elasticsearch.bootstrap.Security.createPermissions(Security.java:215) ~[elasticsearch-5.2.2.jar:5.2.2]
	at org.elasticsearch.bootstrap.Security.configure(Security.java:121) ~[elasticsearch-5.2.2.jar:5.2.2]
	at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:236) ~[elasticsearch-5.2.2.jar:5.2.2]
	at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) ~[elasticsearch-5.2.2.jar:5.2.2]
	at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:121) ~[elasticsearch-5.2.2.jar:5.2.2]
	... 6 more
Caused by: java.nio.file.FileSystemException: /usr/share/elasticsearch/config/scripts: No space left on device
	at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91) ~[?:1.8.0_92-internal]
	at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) ~[?:1.8.0_92-internal]
	at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) ~[?:1.8.0_92-internal]
	at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:384) ~[?:1.8.0_92-internal]
	at java.nio.file.Files.createDirectory(Files.java:674) ~[?:1.8.0_92-internal]
	at java.nio.file.Files.createAndCheckIsDirectory(Files.java:781) ~[?:1.8.0_92-internal]
	at java.nio.file.Files.createDirectories(Files.java:767) ~[?:1.8.0_92-internal]
	at org.elasticsearch.bootstrap.Security.ensureDirectoryExists(Security.java:421) ~[elasticsearch-5.2.2.jar:5.2.2]
	at org.elasticsearch.bootstrap.Security.addPath(Security.java:377) ~[elasticsearch-5.2.2.jar:5.2.2]
	at org.elasticsearch.bootstrap.Security.addFilePermissions(Security.java:251) ~[elasticsearch-5.2.2.jar:5.2.2]
	at org.elasticsearch.bootstrap.Security.createPermissions(Security.java:215) ~[elasticsearch-5.2.2.jar:5.2.2]
	at org.elasticsearch.bootstrap.Security.configure(Security.java:121) ~[elasticsearch-5.2.2.jar:5.2.2]
	at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:236) ~[elasticsearch-5.2.2.jar:5.2.2]
	at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) ~[elasticsearch-5.2.2.jar:5.2.2]
	at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:121) ~[elasticsearch-5.2.2.jar:5.2.2]
	... 6 more
```


### docker-compose.yml

```yml
services:
  elasticsearch:
    build:
      context: .
      dockerfile: Dockerfile-elasticsearch
    environment:
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - xpack.security.enabled=false
      - transport.host=127.0.0.1
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    mem_limit: 1g
    cap_add:
      - IPC_LOCK
    volumes:
      - esdata:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
```


volumesのesdataが、ローカルディレクトリを指定していないので、仮想環境内にボリュームファイルを作成します。
しかし、仮想環境内のディスク容量が不足していると、ボリュームファイルを作成できないとエラーが出てしまう。

ちなみに、以下のようにボリューム先をローカルディレクトリにすると、ディスク容量不足のエラーはなくなる。

```yml
    volumes:
      - /esdata:/usr/share/elasticsearch/data
```



### 仮想環境内を覗いてみる

仮想環境内では、どのようなディレクト構成になっているのか気になったので、覗いてみました。
まずは、仮想環境に入る。

```shell

$ screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty

```

- imageの保存場所

```shell
docker-desktop:/var/lib/docker/image/overlay2/imagedb/content/sha256
```


- volumesの保存場所

```shell
docker-desktop:docker-desktop:/var/lib/docker/volumes
```

- containerの保存場所

```shell
docker-desktop:docker-desktop:/var/lib/docker/overlay2
```

ファイル容量などをみてみると、`/var/lib/docker/overlay2`が大きくなり、ディスクを圧迫しがちなので、不要なcontainerは削除することを、怠らない方が良い。

```shell

docker-desktop:/var/lib/docker/overlay2# df -h
....
overlay                  62.7G     26.9G     32.6G  45% /var/lib/docker/overlay2/a540053f9f860ce79c702f59fa76c5b525754a32e1a3d52437f4762d6ec84b5a/merged
overlay                  62.7G     26.9G     32.6G  45% /var/lib/docker/overlay2/a61ed0f1b94cad22f8d02b78d29828a6dfcadf3f95496b03d40ef86d26043aaf/merged
overlay                  62.7G     26.9G     32.6G  45% /var/lib/docker/overlay2/0a5984751197f434f6d5b33d78e0fea769ee36487e9fdc24d0d49097afab30bc/merged
overlay                  62.7G     26.9G     32.6G  45% /var/lib/docker/overlay2/aa82dc3d35db78d3898a280b2b86a
....
```