Docker で構築した開発環境は再現性が高く、Windows でも macOS でも動くと思われています。
基本的にはその通りなのですが、ホストのファイルシステムが絡んでくるボリュームについては、書き方次第で「Windows では動かない」となることがあります。
この記事では、Windows でも macOS でも動く Docker のボリュームの書き方をまとめます。
検証した環境
- Docker for Windows (Windows 10, WSL2 backend)
- Docker for Mac (macOS Monterey, Apple M1)
docker run の場合
docker run の場合と Docker Compose の場合でも書き方が異なるので、まずは docker run を使う場合について書いていきます。
docker run するときは、Windows でも macOS でも同じ書き方で動きます。
一番よさそうな書き方
docker run -v $PWD/mydir/subdir:/work ubuntu ls /work
docker run の -v オプションでホストのパスを指定する箇所では、(pwd)、`pwd` を使って、絶対パスで書くのが一番よさそうです。
NG な書き方
docker run -v mydir/subdir:/work ubuntu ls /work
のように、相対パスで記述してしまうと、以下のようなエラーになります。
docker: Error response from daemon: create myapp/subdir: "myapp/subdir" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path.
See 'docker run --help'.
ホストのディレクトリを指定する場合は絶対パスを使う必要があるためです。
一応、「/」という文字を含まない以下のような形式であれば動作しますが、普段から絶対パスで指定するのが良いでしょう。
docker run -v mydir:/work ubuntu ls /work
Docker Compose の場合
一番よさそうな書き方
version: '3'
services:
nginx:
image: nginx:1.21.6-alpine
volumes:
- ./nginx/html:/usr/share/nginx/html
docker-compose.yaml の場合、相対パスで書くのが一番よさそうです。
もしホームディレクトリを基準にしたい場合は、「~/mydir」のように指定してください。
NG な書き方
docker run で絶対パスを指定したのと同様に、
- $PWD/nginx/html:/usr/share/nginx/html
と書きたくなると思います。
しかし、この書き方では、Windows で
WARNING: The PWD variable is not set. Defaulting to a blank string.
という WARNING が出力される場合があり、その際は $PWD が空文字列として解釈されてしまいます。
$PWD は Windows でも動く場合・動かない場合があり、詳細な再現条件は分からないですが、避けたほうが無難でしょう。
まとめ
以上をまとめると、
- docker run では「$PWD」などを使って絶対パスで指定する
- docker-compose.yaml では「.」や「~」を使って相対パスで指定する
ということになります。
これで今後は悩むことがなくなりそうです。