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 で設定されている elasticsearchvolumes に相対パスが指定されていることが原因です。

WSL では、/mnt 配下にディスクがマウントされます。一方で、Docker for Windows では / 配下にマウントされます。この違いにより、相対パスで設定した elasticsearch.yml が見つからず、volume のマウントエラーが発生してしまいます。

docker-compose.yml
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 のマウント設定を行います。

/etc/wsl.conf
[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 も絶賛開発中のようです。

参考