Docker Machine の環境変数を rc ファイル内で自動で設定する

Linux 以外で Docker を使うには、Linux のホストマシンを VM で用意する必要があります。もっともメジャーなのは Boot2Docker でしょうが、個人的には Docker Machine を使うのがおすすめです。まだベータ版ですが、基本的な機能は特に問題なく使えています。

Docker Machine は複数のホスト VM を切り替えることができるのが1つの利点ですが、これにより逆に不便になってしまったことがあります。 Boot2Docker を使う場合、ホスト VM 起動後

1
2
3
4
$ boot2docker shellinit
export DOCKER_HOST=tcp://192.168.59.103:2376
export DOCKER_CERT_PATH=/Users/skatsuta/.boot2docker/certs/boot2docker-vm
export DOCKER_TLS_VERIFY=1

により生成される環境変数を設定するために、 .bashrc.zshrc などに

1
eval "$(boot2docker shellinit)"

と書いておけばいいのですが、 Docker Machine の場合はホストを複数作れるために、上記のように一筋縄ではいきません。

Docker Machine で同じように環境変数を設定する場合、以下のようにホスト VM の名前の指定が必要です。たとえば dev というホスト VM を作った場合、

1
2
3
4
5
6
7
$ docker-machine env dev
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.101:2376"
export DOCKER_CERT_PATH="/Users/skatsuta/.docker/machine/machines/dev"
export DOCKER_MACHINE_NAME="dev"
# Run this command to configure your shell:
# eval "$(docker-machine env dev)"

で環境変数が取得できます。このホスト VM 名は存在し、かつ動いているものでなければなりません。

いろいろ模索と妥協をした結果、 docker-machine ls コマンドと組み合わせることにより、現状動いているホスト VM を1つ取り出して、その環境変数を設定するシェルスクリプトを .zshrc に書くことにしました。

.zshrc
1
2
3
4
5
6
7
8
9
# check if `docker-machine` command exists
if command -v docker-machine > /dev/null; then
# fetch the first running machine name
local machine=$(docker-machine ls | grep Running | head -n 1 | awk '{ print $1 }')
if [ "$machine" != "" ]; then
eval "$(docker-machine env $machine)"
export DOCKER_IP=$(docker-machine ip $machine)
fi
fi

IP アドレスだけを使いたいときもあるので、同時に DOCKER_IP という変数も設定しています。

これでちょっとだけ手間が省けます。