ようへいの日々精進XP

よかろうもん

kitchen-docker が動きました

追記(2)

  • 11/29 test-kitchen と kitchen-docker がバージョンアップされていました
  • 動くようになりました!!

追記

  • 11/26 に Docker 0.7 がリリースされたようです
  • 残念ながら自分の環境では kitchen-docker は普通には動いてくれてません...

はじめに

  • test-kitchen のドライバの一つ kitchen-docker をとりあえず動かした
  • とりあえず動かした理由と対応をメモる

参考


動かした環境

  • Ubuntu 13.10
  • lxc-docker-0.6.7
  • kitchen-docker 0.10.0
  • test-kitchen 1.0.0.beta.4

いきなり動かない

bundle install からの kitchen create で下記の状態になっていきなり動かない。

f:id:inokara:20131124072113p:plain

原因と思しきポイント

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

f:id:inokara:20131124085930p:plain

以下、関連するコードの抜粋。

docker.rb

kitchen-docker-0.10.0/lib/kitchen/driver/docker.rbkitchen 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.rbwait_for_sshd メソッド。

      def wait_for_sshd(hostname, username = nil, options = {})
        SSH.new(hostname, username, { :logger => logger }.merge(options)).wait
      end

docker.rb から hostnameport の引数をつけて呼んでるけど、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)

  • 下記の追記を確認

追記

別の環境では動いた

動いた環境

  • Ubuntu 13.04
  • lxc-docker-0.6.7
  • kitchen-docker 0.10.0
  • test-kitchen 1.0.0.beta.4
  • SSH のデーモンサービスが稼働している

なんで動いたのか?

wait_for_sshd から呼ばれる wait メソッドでコンテナssh のポートを監視しているっぽいけど、監視対象が localhost:22 となり、コンテナの ssh ポートではなくコンテナをホストするマシンの ssh ポートを監視してしまう為。ということで、

f:id:inokara:20131124110328p:plain

動かなかったホストにも 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 の各種ドライバを見る機会になった