追記(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
の各種ドライバを見る機会になった