Windowsでmsys2のmake等を使いながら、Makefileでdockerを使ったコマンドを定義するときの、volume mountがうまいこといかなかったのでメモ。 PowerShellと書いているけれど、msys2のminttyからmakeを叩いたときにも通用する。
hoge: docker run --rm --volume '${CURDIR}:/workspace' alpine:3.9 ls /workspace
これだとmsys2がパスをうまいことやろうとして、 /workspace
を C:
始まりの文字列に変換したりするので、うまいこといかない。
この挙動は、コンテナ内のパス指定を、 //
で開始するようにすればなんとかなる。
ただし、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だけでなく、linuxやmacなんかでも共通の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