🐳
Docker Desktop for Windows from Msys2
WindowsでDocker DesktopをMsys2 bashから起動するお話。
単にローカルファイルシステムをボリュームとしてマウントしようとすると、MinGWのPOSIX path conversionに引っかかって死ぬ(うまくいかない)。jekyllの例でいうとこんな感じ。
$ docker run --rm -v $(pwd):/srv/jekyll jekyll/jekyll:pages jekyll build
$(pwd) は /home/foobar/path/to/current_work_dir に展開されるものの、POSIX path conversion によって C:\msys64\home\foobar\...みたいに変換される。さらに : を挟んで後ろ側の /srv/jekyll も C:\msys64\srv\jekyll あたりに展開されることになり、docker(コンテナ)側から見るとなんのこっちゃ状態。
回避方法は前半を $(cygpath -w $(pwd)) とすること。cygpath -wは /home/foobar/... を C:\home\foobar\... という感じのWindowsパス形式に変換してくれる。 これは引数がドライブレターで始まる場合はPOSIX path conversionが適用されないことを利用している。
Arguments starting with a drive specifier (eg C:) are considered to be Windows paths and are not converted
で、実行コマンド全体を示すとこんな感じ。
$ docker run --rm -v ”$(cygpath -w $(pwd)):/srv/jekyll" jekyll/jekyll:pages jekyll build
ただコレだとLinuxでは動かなくなっちゃうので、以下のようなスクリプトを書いて楽をする。
#!/bin/bash
set -eu
dir="$(pwd)"
case $(uname -s) in
MSYS*) dir=$(cygpath -w $dir) ;;
esac
docker run --rm -it -v "${dir}:/srv/jekyll" jekyll/jekyll:pages "$@"
Discussion