みなさんVimとコンテナは好きですか?
普段VimでDockerfileを書いたりする時にコンテナの状態気になりませんか?
あの子元気かな?とか、この子今起きているかなとか、いろいろ気になると思います。
そんな方むけにVimからコンテナを操作したり、監視したりするプラグインを作ってみました。
どういうやつ?
できること
現時点で以下のことができます。
のんびり開発中でまだ実装したい機能がありますが、とりあえず形になったので公開しました。
images
- get images
- delete image
- pull image
containers
- start/stop/restart/kill container
- delete container
- attach container(require docker command)
- monitoring container CPU/MEM
使い方
READMEを参照してください。
コマンドとキーバインドがあります。基本一覧ではキーバインドを使った操作になります。
例えば、:DockerContainers
でcontainers画面を開き、uでコンテナ起動、sでコンテナを停止します。
おすすめポイント
Vimを止めることなくattachしつつ、CPUやMEMの使用率を監視できる機能が推しです。
ただ、モニターに関しては現在Mac/Linuxしか対応していないので、今後Windowsも対応していく予定です。
attachに関しては、裏でdocker exec -it {container} {cmd}
というふうに実行しているので、dockerコマンドが必要になってきます。
仕組み
API通信は裏でcurlを使っています。
curl --unix-socket /var/run/docker.sock http://localhost/containers/json
という感じでコマンドを実行しています。
こちらはvital
というライブラリのweb.http
モジュールを使っています。
プラグインで使いやすいように、それを更にすこしwarapした関数を用意しました。
" http get
function! docker#api#http#get(url, param) abort
return s:HTTP.request(a:url, {
\ 'unixSocket': '/var/run/docker.sock',
\ 'param': a:param
\ })
endfunction
あとは docker#api#http#get
にurl
とqueryparameter
を渡せば良いだけです。簡単ですね。
一覧表示ではテーブルを使っています。こちらに関しては、text.table
モジュールを使用しています。
こちらを使用すれば簡単にテーブルを作れます。とても便利ですね。
" ヘッダとカラム数を指定してtableオブジェクトを作る
let l:image_table = s:TABLE.new({
\ 'columns': [{},{},{},{},{}],
\ 'header' : ['ID', 'REPOSITORY', 'TAG', 'CREATED', 'SIZE'],
\ })
" curlのレスポンスを1行ずつ整形してテーブルに追加
for row in a:ctx.content[a:ctx.offset:a:ctx.offset + a:ctx.top - 1]
let l:image = docker#util#parse_image(row)
call l:image_table.add_row([
\ l:image.Id,
\ l:image.Repo,
\ l:image.Tag,
\ l:image.Created,
\ l:image.Size])
endfor
" table.stringify()で実際のテーブルテキストを出力
let a:ctx.view_content = l:image_table.stringify()
ざっくりですが、実はそんな難しいことはしていなくて、
裏でDocker EngineのAPIを叩いて結果に応じてVimのポップアップウィンドウを使っていい感じにインターフェイスを用意して操作する感じです。
最後に
このプラグインはまだ開発途中です。
バグや要望があればissueやPRをください。みなさんの意見・要望・PRがたくさん来ることを楽しみにしています。