PowerShell + msys2でのMakefileによるdocker volume mountについて

Windowsでmsys2のmake等を使いながら、Makefileでdockerを使ったコマンドを定義するときの、volume mountがうまいこといかなかったのでメモ。 PowerShellと書いているけれど、msys2のminttyからmakeを叩いたときにも通用する。

hoge:
    docker run --rm --volume '${CURDIR}:/workspace' alpine:3.9 ls /workspace

これだとmsys2がパスをうまいことやろうとして、 /workspaceC: 始まりの文字列に変換したりするので、うまいこといかない。 この挙動は、コンテナ内のパス指定を、 // で開始するようにすればなんとかなる。

ただし、dockerのvolume mountが絡んだとき、docker for windowsでは C: 始まりのwindowsの形式によるパスを期待するため、 ${CURDIR} ではうまいことvolume mountできない。 ${CURDIR} はmakeの変数で、例えば /c/Users/kamichidu みたいなパスになる。 PowerShellから直接dockerを叩くときなんかは、 docker run -v ${PWD}:/workspace みたいにすれば良いのだけど、makeで簡単なコマンドをまとめたいときには使えない。

結論、以下のようにする。

BASEDIR=$(subst /,\\,$(subst /c,C:,${CURDIR}))

hoge:
    docker run --rm --volume '${BASEDIR}://workspace' alpine:3.9 ls //workspace

私の場合、windowsだけでなく、linuxmacなんかでも共通のMakefileを使いたいので、最終的に以下のようにした。

ifeq (${OS},Windows_NT)
    BASEDIR=$(subst /,\\,$(subst /c,C:,${CURDIR}))
else
    BASEDIR=${CURDIR}
endif

hoge:
    docker run --rm --volume '${BASEDIR}://workspace' alpine:3.9 ls //workspace