再訪:「Unixのルートって // でいいのか…。(初めて知ったぞ)」Docker を MSYS bash から動かしたくて、の巻

7年前の気付きは plink 関係

MSYS の乱暴で不可避な「/始まりならば問答無用で c:/msys/1.0/ に置換するんだもんね僕エラいでしょ褒めて褒めてぇ」が問題になるパターンというのは、「この Windows PC の外の(URI形式でない)パス」もしくは「パスですらないがパスに似た文字列」を指定する必要がある場合。なので plink で問題になるのは当たり前。「おれんちでない Unix サーバ機内のパス」を指定する必要があったりして、その際に「褒めて褒めてぇ」が発動する、てわけね(例えば「/home/someuser」のような「アチラ」のパス)。

またなのよ。今度は Docker

Docker を外から観察するのに一番近い類推はまさしく ssh (や rlogin/rsh)ね。リモートマシンのように考えればわかりやすい。のでその「(ミニ)リモートマシン」と「おれんPCんち」とでファイルの授受をするには「—volume」によるマッピングをしなければならない、てことまではおけ?

pandoc を例に。

まず、ワタシは docker 版でない、ネイティブな Windows 版 pandoc を持っている。この場合、例えば rst から markdown に変換するには例えば:

1 [me@host: ~]$ pandoc input.rst -o output.md

でいい。pandoc もかなり依存物がヘビィで維持が大変なので、Docker でハッピーになろう、と考えたとして。

dockerhub からお取り寄せ
1 [me@host: ~]$ docker pull pandoc/core  # お好みに応じて pandoc/latex を(も)

ssh を介して pandoc を使っているのを思い出しながら以下を理解するといい:

//のデバン
1 [me@host: ~]$ docker run --volume=`pwd`://data pandoc/core //data/input.rst -o //data/output.md 

「カレントディレクトリをリモートの /data にマッピング」ということなんだけれど、MSYS を介さないなら // なんてしなくていい。が、ここで確認した通り、// は本来の Unix の仕様として認められてるみたいなので、考えるのが面倒ならルートを「//」とする手癖にしちゃってもいい気がする。

にしても docker をちょこちょこ遊び始めてはいるんだけど、いくつかのパターンごとのケーススタディとしてまとめた方がいい気がしてる。ファイルの連携、ターミナルの連携、ネットワーク、という3つかな。物理ファイルをやりとりするもの、標準入出力がインターフェイスであるもの、通信で連携するサービスタイプ。これらそれぞれで個々に違うハマりポイントがあるように思う。


2022-05-26追記:
MSYS の「問答無用」の振る舞いは実は「msys-*.dll に依存するアプリケーションか否か」に応じて切り替わっているんだけれど、ちょっとね、どういう規則性か謎なのだが、「c:/」形式と「/c/」形式の切り替えが時々オカシイ:

1 [me@host: dat]$ # 以下ではなぜかお節介発動し pwd は f:/mydev/dat。お節介は続く
2 [me@host: dat]$ # //wk にも続き、「f;c」なんて妙なことになる。(パスデリミタの
3 [me@host: dat]$ # ; に続くスラッシュ始まりと誤解されて、ここも MSYS はご丁寧に
4 [me@host: dat]$ # c:/msys/1.0 に置換しようとしてる。)
5 [me@host: dat]$ docker run --name=rb -it -v "`pwd`"://wk -w //wk --rm ruby ruby a.rb
6 [me@host: dat]$ # これについては回避不能ではなくて、措置できる。
7 [me@host: dat]$ docker run --name=rb -it \
8 > -v "`/bin/pwd`"://wk -w //wk --rm ruby ruby a.rb

ビルトインの pwd だと f:/、/bin/pwd だと /f/ みたいだね。

というかこういのがイヤな人は msys2 を使おうね。これで言った通り、ワタシが MSYS を使うのは「皆にもオススメ」だからではないの。ワタシには使う理由があるし、cygwin や msys2 を避ける理由があるけれど、あなたにはそれはないと思っていい。