やりたいこと

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内でファイルを操作するほうがよさそう。

参考にさせていただいたサイト