概要
Ruby から docker API の events 情報を取得してみました
簡単な使い方と Tips を紹介します
環境
- Mac OS X 10.12.3
- docker 17.03
- ruby 2.2.3
- docker-api 1.33.2
docker-api ライブラリのインストール
- bundle init
- vim Gemfile
gem "docker-api"
- bundle install
イベント情報の待ち受け
- vim events.rb
require 'docker'
Docker::Event.stream { |event|
puts event
}
- bundle exec ruby events.rb
で待受状態になります
挙動確認
docker コマンドでコンテナを立ち上げてみましょう
docker run --rm alpine date
すると以下のような出力が表示されると思います
Docker::Event { 1491152422543453362 container create 313a130d7f9395655fb14b7311d9d05cf4a81117f08ea92a1f970d2b67a1f069 (image=alpine, name=blissful_mestorf) }
Docker::Event { 1491152422547042436 container attach 313a130d7f9395655fb14b7311d9d05cf4a81117f08ea92a1f970d2b67a1f069 (image=alpine, name=blissful_mestorf) }
Docker::Event { 1491152422642621021 network connect ac9cb0cf106310f33ae77d528b4aa1d7c47c8a55b91f12b6afe12d00844a40a2 (container=313a130d7f9395655fb14b7311d9d05cf4a81117f08ea92a1f970d2b67a1f069, name=bridge, type=bridge) }
Docker::Event { 1491152423026533369 container start 313a130d7f9395655fb14b7311d9d05cf4a81117f08ea92a1f970d2b67a1f069 (image=alpine, name=blissful_mestorf) }
Docker::Event { 1491152423104603794 container die 313a130d7f9395655fb14b7311d9d05cf4a81117f08ea92a1f970d2b67a1f069 (exitCode=0, image=alpine, name=blissful_mestorf) }
Docker::Event { 1491152423398573335 network disconnect ac9cb0cf106310f33ae77d528b4aa1d7c47c8a55b91f12b6afe12d00844a40a2 (container=313a130d7f9395655fb14b7311d9d05cf4a81117f08ea92a1f970d2b67a1f069, name=bridge, type=bridge) }
Docker::Event { 1491152423554556161 container destroy 313a130d7f9395655fb14b7311d9d05cf4a81117f08ea92a1f970d2b67a1f069 (image=alpine, name=blissful_mestorf) }
結果が docker events
と同じイベントの流れになっていることが確認できると思います
Tips
read timeout reached (Docker::Error::TimeoutError)
になる場合は以下のように設定し stream を開始します
この場合 900sec x 4 = 3600sec = 1h タイムアウトを待つようになります
なぜか 4 を掛けた値になっているようです
Docker.options = { :read_timeout => 900 }
Docker::Event クラスの各フィールドにアクセスする方法は以下の通りです
require 'docker'
Docker::Event.stream { |event|
puts "from: #{event.from}"
puts "id: #{event.id}"
puts "status: #{event.status}"
puts "time: #{event.time}"
puts "type: #{event.type}"
puts "action: #{event.action}"
puts "actor: #{event.actor}"
puts "actor.id: #{event.actor.id}"
puts "actor.attributes: #{event.actor.attributes}"
puts "time_nano: #{event.time_nano}"
puts event
}
デフォルトでは Docker の API はバージョン 1.16 をコールしているそうでs
で、これを編集したい場合はコードを直接編集する必要がありそうです
- vim
vendor/ruby/2.2.3/gems/docker-api-1.33.2/lib/docker/version.rb
API_VERSION = '1.23'
ちゃんとクライアントからバージョンを編集できるように以下の p-r が出ているのですが、どうやら Close されているようです
https://github.com/swipely/docker-api/pull/462
最後に
Ruby から docker API を使ってイベント情報をストリームで取得してみました取得するだけなのでかなり簡単に取得できます
リモートの docker にアクセスする場合は options を設定した感じで Docker.url = 'tcp://example.com:5422'
という感じで設定するようです
次回は取得できた情報を Slack にでも通知してみたいと思います
0 件のコメント:
コメントを投稿