わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

Cygwinで,dockerコマンドが使えるようになった!

本記事ではDocker Toolboxがインストールされているのを前提として,Cygwinのmintty上で,dockerコマンドが使えるようになるまでのプロセスを報告します.Cygwinのシェルで,「which docker」を実行すると,以前にインストールしたDocker Toolboxのパスが表示されています.ですが「docker ps」を実行すると,以下のエラーが出て,動きません.

error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.31/containers/json: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.

これまでは,Docker Quickstart Terminalを起動し,そこでコマンドを実行していましたが,普段と違う端末のため,使い勝手が良いとは言えませんでした.
時間をとって,Webで調べると,解決方法が書かれていました.上記のエラーは,環境変数が適切に設定されていないためでした.「eval $(docker-machine env)」というコマンドを,(Cygwinの)mintty上で実行すれば,設定されました.なお,「docker-machine env」だけを実行すると,DOCKER_TLS_VERIFY,DOCKER_HOST,DOCKER_CERT_PATH,DOCKER_MACHINE_NAME,COMPOSE_CONVERT_WINDOWS_PATHSという5つの環境変数に値を設定するexportコマンドと,「eval $("(パス)\docker-machine.exe" env)」を実行せよというコメントが表示されます.
しかしまだ,dockerが思うように動きません.エラーメッセージに「vboxmanage」という語を見かけました*1
これは,vboxmanageを実行できるよう,aliasを実行することで,対処しました.具体的なコマンドは,「alias vboxmanage="${VBOX_MSI_INSTALL_PATH}VBoxManage.exe"」です.VBOX_MSI_INSTALL_PATHは以前より設定されていた環境変数です.
ここまで書いた2つのコマンドは,Cygwinでシェルを起動するたびに,実行する必要があります.環境変数VBOX_MSI_INSTALL_PATHが定義されているときのみ,この設定をするよう,~/.zshrcに以下の記述を入れました.

if [ ${+VBOX_MSI_INSTALL_PATH} = 1 ]; then
  eval $(docker-machine env)
  alias vboxmanage="${VBOX_MSI_INSTALL_PATH}VBoxManage.exe"
fi

これで,「docker ps」や「docker run hello-world」は動くようになりました.しかし「docker run -it ubuntu bash」を実行すると,また別のエラーが出ます.

the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'

「winpty」で検索すると,この名前のコマンドを作り,実行時に最初に書けばいいと分かりました.winptyのソースはGitHubより入手できるので,以下のコマンドを実行してビルドし,/usr/local/bin/winptyに置きました.

cd ~/src
git clone https://github.com/rprichard/winpty.git
cd winpty
./configure
make
make install
which winpty

「docker run -it ubuntu bash」に替えて「winpty docker run -it ubuntu bash」と実行すると,「root@コンテナID:~# 」によるプロンプトが出ました.シェル上では,dateやdfやechoなどのコマンドが実行できました.実行コマンドに日本語文字を打ち込むと,そのまま表示されず,「'」の並びになってしまいましたが,1年ほど前に書いた,日本語対応のUbuntu環境を作るためのDockerfileを,(Dockerが稼働する)Linuxサーバからコピーし,dockerでビルドして実行すれば,入力できるようになりました.
なお,本記事作成のPCのほか,もう一つも,Hyper-Vが有効化されていたこともあり,Docker for Windowsで動かしています.環境変数やvboxmanageの設定は,しなくてもよくなったものの,いくつかのdockerコマンドでは,前にwinptyを置く必要があります.


問題解決に役立ったページにリンクします.

*1:本記事執筆時点で,検証用PCにこのエラーが出なくなりました.