管理人Kのひとりごと

デジモノレビューやプログラミングや写真など

Git Bashでdockerを実行する場合には「winpty」を付ける

Git BashでWindowsにインストールしたdockerを実行する場合には「winpty docker ...」と入力するというメモです。

確認環境

C:\Users\hoge>docker --version
Docker version 20.10.6, build 370c289

minitty 3.4.4

起こった事象と対処

以下のように、Git Bashから、Windows側のdockerを実行しようとしたところwinptyを付けて実行するように言われました。

hoge@hoge-asus MINGW64 ~/Downloads
$ docker run --rm -it python:3.8.10 bash
the input device is not a TTY.  If you are using mintty, try prefixing the command with 'winpty'

いわれた通りwinptyを付けて実行したところ、正しい結果が得られました

hoge@hoge-asus MINGW64 ~/Downloads
$ winpty docker run --rm -it python:3.8.10 bash
root@64c0d58524eb:/#

winptyとは?その役目は?

下記の記事にwinptyとは何かや、ptyとは何か、docker以外でwinptyを使うべき場面など、丁寧に記載されていました。
mseeeen.msen.jp
上の記事によると、winptyとは

Windows のコンソールプログラムと UNIX の仮想端末を通信させるためのインタフェース

ということだそうです。minittyからWindows側のプログラムを実行する場合に、minitty⇔Windowsの差異を良しなに解消してくれるものみたいです。

winptyを付けた結果/付けない結果

上記の記事に紹介されているminittyでの「ipconfig」の実行について、手元の環境でwinptyあり、なしそれぞれで実行してみました。

# winptyなし→文字化ける
hoge@hoge-asus MINGW64 ~/Downloads
$ ipconfig

Windows IP Configuration

Wireless LAN adapter ▒▒▒[▒J▒▒ ▒G▒▒▒A▒ڑ▒* 1:

   Media State . . . . . . . . . . . : Media disconnected
   Connection-specific DNS Suffix  . :

# winptyあり→文字化けない
hoge@hoge-asus MINGW64 ~/Downloads
$ winpty ipconfig

Windows IP 構成

Wireless LAN adapter ローカル エリア接続* 1:

   メディアの状態. . . . . . . . . . . .: メディアは接続されていません
   接続固有の DNS サフィックス . . . . .:

なるほど、minitty→UTF-8、ipconfig→結果はSJISですが、winptyが文字コードを変換してくれていますね。
これからminittyでWindows側のプログラムを呼び出す場合はwinptyを付けるようにしよう。