やりたいこと
WSL2上で動かしているDocker Composeで、Windowsのローカルフォルダ(例えばC:\hoge)をバインドマウントしたい。
環境
- OS:Windows 11 Pro
- バージョン:23H2
- OSビルド:22631.4037
- WSL2
- Ubuntu 22.04.3
- Docker 27.0.3
- Docker Compose v2.26.1-desktop.1
方法
Windowsのローカルフォルダを「/mnt/c/hoge」という形でcompose.ymlに記載する。
- Short syntax
volumes:
- "/mnt/c/hoge:/opt"
- Long syntax
volumes:
- type: bind
source: /mnt/c/hoge
target: /opt
docker inspectコマンドの「Mounts」部分でバインドマウントが問題なく設定できていればOK。
$ docker inspect --format='{{json .Mounts}}' <コンテナID> | jq
[
{
"Type": "bind",
"Source": "/mnt/c/hoge",
"Destination": "/opt",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
余談
- docker runコマンドでも同様に/mnt/c/hogeという形で指定すればOK。
$ docker run -v /mnt/c/hoge:/opt …
- WSL2上では、/mnt配下にWindows上のファイルシステムがマウントされている。ファイルシステムの共有には9pプロトコルが使用されている。
$ df -h /mnt/c
Filesystem Size Used Avail Use% Mounted on
C:\ 476G 109G 368G 23% /mnt/c
$ mount | grep /mnt/c
C:\ on /mnt/c type 9p (rw,noatime,dirsync,aname=drvfs;path=C:\;uid=1000;gid=1000;symlinkroot=/mnt/,mmap,access=client,msize=65536,trans=fd,rfd=5,wfd=5)
-
反対にWindows上ではネットワーク共有の\wsl$にアクセスすることで、WSL2側のファイルシステムにアクセスできる。
-
ただし、Microsoftの公式サイトにも記載があるように、WSLに比べてWSL2はOSファイルシステム間のパフォーマンスが劣るようなので、速度が必要な環境を構築したい場合は、WSL2内でファイルを操作するほうがよさそう。