🐳
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