2017年4月6日木曜日

Ruby で docker events の情報を取得してみた

概要

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 件のコメント:

コメントを投稿