🐳

Docker Desktop for Windows from Msys2

2020/09/18に公開

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/jekyllC:\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