WSLとDocker for WindowsでGROWIを動かすとvolumesでつまずく
-
Docker for Windows をインストールした Windows 10 での話です。
WSL 経由で docker-compose を操作して GROWI を起動させようとするとエラーが発生します。
volume 問題
環境
$ docker -v
Docker version 18.09.4, build d14af54266
$ docker-compose -v
docker-compose version 1.24.0, build 0aa59064
docker-compose で GROWI の環境構築できる docker-compose が公式から提供されているので clone します。
cd /mnt/d/username/app
git clone https://github.com/weseek/growi-docker-compose.git
その後、docker-compose up -d
を実行すると以下のようなエラーが発生します。
username@PC:/mnt/d/username/app/growi-docker-compose$ docker-compose up -d
Creating network "growi-docker-compose_default" with the default driver
Creating volume "growi-docker-compose_growi_data" with default driver
Creating volume "growi-docker-compose_mongo_configdb" with default driver
Creating volume "growi-docker-compose_mongo_db" with default driver
Creating volume "growi-docker-compose_es_data" with default driver
Creating growi-docker-compose_mongo_1 ... done
Creating growi-docker-compose_elasticsearch_1 ... error
ERROR: for growi-docker-compose_elasticsearch_1 Cannot start service elasticsearch: OCI runtime create failed: container_linux.go:344: starting container process caused "process_linux.go:424: container init caused \"rootfs_linux.go:58: mounting \\\"/mnt/d/username/app/growi-docker-compose/elasticsearch/config/elasticsearch.yml\\\" to rootfs \\\"/var/lib/docker/overlay2/10816967bd4a6065b087c5b2ebc9707f8e004fa6f4b6b0bc37306076ded0d764/merged\\\" at \\\"/var/lib/docker/overlay2/10816967bd4a6065b087c5b2ebc9707f8e004fa6f4b6b0bc37306076ded0d764/merged/usr/share/elasticsearch/config/elasticsearch.yml\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
ERROR: for elasticsearch Cannot start service elasticsearch: OCI runtime create failed: container_linux.go:344: starting container process caused "process_linux.go:424: container init caused \"rootfs_linux.go:58: mounting \\\"/mnt/d/username/app/growi-docker-compose/elasticsearch/config/elasticsearch.yml\\\" to rootfs \\\"/var/lib/docker/overlay2/10816967bd4a6065b087c5b2ebc9707f8e004fa6f4b6b0bc37306076ded0d764/merged\\\" at \\\"/var/lib/docker/overlay2/10816967bd4a6065b087c5b2ebc9707f8e004fa6f4b6b0bc37306076ded0d764/merged/usr/share/elasticsearch/config/elasticsearch.yml\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
ERROR: Encountered errors while bringing up the project.
原因
docker-compose.yml
で設定されている elasticsearch
の volumes
に相対パスが指定されていることが原因です。
WSL では、/mnt
配下にディスクがマウントされます。一方で、Docker for Windows では /
配下にマウントされます。この違いにより、相対パスで設定した elasticsearch.yml
が見つからず、volume のマウントエラーが発生してしまいます。
elasticsearch:
build:
context: ./elasticsearch
dockerfile: ./Dockerfile
environment:
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms256m -Xmx256m" # increase amount if you have enough memory
ulimits:
memlock:
soft: -1
hard: -1
restart: unless-stopped
volumes:
- es_data:/usr/share/elasticsearch/data
- ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
解決方法
WSL 側のルートを Docker for Windows に合わせるように WSL のマウント設定を行います。
[automount]
root = /
options = "metadata"
Windows を再起動すると、WSL のマウントルートが /
に変更されていることが確認できます。
変更前
$ pwd
/mnt/d/username/app/growi-docker-compose
変更後
$ pwd
/d/username/app/growi-docker-compose
これで無事に docker-compose コマンド一発で GROWI を構築することができるようになりました。
余談
docker-compose で手軽に環境構築できる GROWI。フロントには React.js + jQuery、検索には Elasticsearch という、最強の Wiki 感がたまりません。
ちなみにオンプレ用の GROWI だけでなく、SaaS の GROWI も絶賛開発中のようです。