動作環境
- Windows 10 Pro
- WSL2 ubuntu
- Docker Desktop for Windows
dockerが自動で作ってくれるディレクトリではなく、ホスト側で任意に作成したディレクトリをマウントさせたいという状況がありました。
調べてみたところ、トップレベルでvolumesを定義するとよいみたいです。
しかし、いろんなところに書いてあるやり方でymlを記述してもエラーがでます。。。
version: "3.9"
services:
mount_test:
container_name: "mount_test"
image: alpine
tty: true
volumes:
- volume_test:/tmp/mounted_from_host
volumes:
volume_test:
driver_opts:
type: none
device: /var/docker_test/volume # このディレクトリはあらかじめ作成されており、いくつかのファイルが入っている
o: bind
エラーの内容は以下のような感じ。
$ docker-compose up -d
Creating network "docker-compose-test_mount_from_host_default" with the default driver
Creating volume "docker-compose-test_mount_from_host_volume_test" with default driver
Creating mount_test ... error
ERROR: for mount_test Cannot start service mount_test: error while mounting volume '/var/lib/docker/volumes/docker-compose-test_mount_from_host_volume_test/_data': failed to mount local volume: mount /var/docker_test/volume:/var/lib/docker/volumes/docker-compose-test_mount_from_host_volume_test/_data, flags: 0x1000: no such file or directory
ERROR: for mount_test Cannot start service mount_test: error while mounting volume '/var/lib/docker/volumes/docker-compose-test_mount_from_host_volume_test/_data': failed to mount local volume: mount /var/docker_test/volume:/var/lib/docker/volumes/docker-compose-test_mount_from_host_volume_test/_data, flags: 0x1000: no such file or directory
ERROR: Encountered errors while bringing up the project.
なぜかdockerが自動生成したディレクトリにマウントしようとしています。
修正:ボリュームの定義にdriverを追加する
「driver: local」と追加しました。この項目が必要なようです。いつからか仕様が変わったんですかね…
version: "3.9"
services:
mount_test:
container_name: "mount_test"
image: alpine
tty: true
volumes:
- volume_test:/tmp/mounted_from_host
volumes:
volume_test:
driver: local # ここを追加
driver_opts:
type: none
device: /var/docker_test/volume
o: bind
修正したymlで再度試したら、ちゃんとできました。
実行前に、前回のエラーで作成されたネットワークとボリュームを片付けておきます。
$ docker-compose down && docker volume rm docker-compose-test_mount_from_host_volume_test
Removing mount_test ... done
Removing network docker-compose-test_mount_from_host_default
docker-compose-test_mount_from_host_volume_test
$
$ docker-compose up -d
Creating network "docker-compose-test_mount_from_host_default" with the default driver
Creating volume "docker-compose-test_mount_from_host_volume_test" with local driver
Creating mount_test ... done
$
$ docker-compose exec mount_test cat /tmp/mounted_from_host/helloworld.txt
hello world from mounted from host!!
以上、あなたのお役に立てれば幸いです。