追記(2)
- 11/29 test-kitchen と kitchen-docker がバージョンアップされていました
- 動くようになりました!!
追記
- 11/26 に Docker 0.7 がリリースされたようです
- 残念ながら自分の環境では kitchen-docker は普通には動いてくれてません...
はじめに
- test-kitchen のドライバの一つ kitchen-docker をとりあえず動かした
- とりあえず動かした理由と対応をメモる
参考
- portertech / kitchen-docker
- portertech / kitchen-lxc
- test-kitchen / kitchen-ec2
- GitHubへpull requestする際のベストプラクティス
- コミットメッセージの書き方
動かした環境
- Ubuntu 13.10
- lxc-docker-0.6.7
- kitchen-docker 0.10.0
- test-kitchen 1.0.0.beta.4
いきなり動かない
bundle install からの kitchen create で下記の状態になっていきなり動かない。

原因と思しきポイント
kitchen-create した時に呼ばれる create メソッドから起動したコンテナの ssh のポート番号を監視する為、ドライバ(docker.rb) 内から呼ばれている test-kitchen の ssh_base.rb の wait_for_sshd メソッドにちゃんと引数を渡せていない。

以下、関連するコードの抜粋。
docker.rb
kitchen-docker-0.10.0/lib/kitchen/driver/docker.rb で kitchen create を実行すると呼ばれるメソッド。
def create(state) state[:image_id] = build_image(state) unless state[:image_id] state[:container_id] = run_container(state) unless state[:container_id] state[:hostname] = remote_socket? ? socket_uri.host : 'localhost' state[:port] = container_ssh_port(state) wait_for_sshd(state[:hostname], :port => state[:port]) end
上記メソッドの最後の部分で test-kitchen-1.0.0.beta.4/lib/kitchen/driver/ssh_base.rb にある wait_for_sshd に引数をつけて呼んでいる。
ssh_base.rb
そして /var/lib/gems/1.9.1/gems/test-kitchen-1.0.0.beta.4/lib/kitchen/driver/ssh_base.rb の wait_for_sshd メソッド。
def wait_for_sshd(hostname, username = nil, options = {}) SSH.new(hostname, username, { :logger => logger }.merge(options)).wait end
docker.rb から hostname と port の引数をつけて呼んでるけど、port が受けられるようになっていないっぽいぞ...。
とりあえず動かした
とりあえずの対策(1)
弄くりはじめると test-kitchen やら net-ssh 等まで追わないといけなくなりそうだったのでとりあえずの対策としてドライバ(kitchen-docker)の wait_for_sshd を無効にしてみた。
def create(state) state[:image_id] = build_image(state) unless state[:image_id] state[:container_id] = run_container(state) unless state[:container_id] state[:hostname] = remote_socket? ? socket_uri.host : 'localhost' state[:port] = container_ssh_port(state) #wait_for_sshd(state[:hostname], :port => state[:port]) end
この対応でひとまず kitchen create から kitchen destroy までの一連の動作は行えるようになった。
issue と pull request
恐る恐る issue と pull request も送ってみて、pull request には以下のようにコメントを頂いた。
Removing wait_for_sshd will cause immediate other actions to fail, as the assume SSH access to the suite container. I'm think your issues are related to the Docker API returning a response that the driver is failing to parse/understand.
確かに wait_for_sshd を無効にすることの影響範囲については保証出来ないし、ドライバ側で Docker API のパースに失敗しているでは?と助言を頂いたので pull request はクローズさせて頂きました...。
とりあえずの対策(2)
- 下記の追記を確認
追記
別の環境では動いた
動いた環境
なんで動いたのか?
wait_for_sshd から呼ばれる wait メソッドでコンテナの ssh のポートを監視しているっぽいけど、監視対象が localhost:22 となり、コンテナの ssh ポートではなくコンテナをホストするマシンの ssh ポートを監視してしまう為。ということで、

動かなかったホストにも openssh-server をインストールして対応するのも対応の一つかと。
でもさ
上記の図の通り、コードの意図的にはコンテナの ssh ポートを監視するはずなので、これでちゃんと動くとは言い難いのでは?ということで、引き続き、テストする。
とりあえずの対策(3)
洗濯物を干しながら思いついた対策。 ポート番号のことは忘れてホスト名に着目して修正してみた。
これでも動く。 もう少しテストしてこっちでも pull request 投げてみる。
memo
Ubuntu で docker の最新版(リリースバージョン)パッケージを追随する
sudo sh -c 'echo "deb https://get.docker.io/ubuntu docker main" >> /etc/apt/sources.list.d/docker.list' sudo apt-get update
ruby の可変長引数
メソッドに可変長引数を渡す場合には args* を使う
def foo(args*) ... end foo( "a", "b", "c" )
irb っぽい pry
irb っぽいというか irb を機能強化した pry を使ってみた。
導入
gem でインストール。
sudo gem install pry --no-ri --no-rdoc -V
起動
コマンドラインから以下を実行。
pry
最後に
- 他に同じ現象になっているヒトはいないのかしら...
test-kitchenの各種ドライバを見る機会になった