DockerのコンテナIDとプロセスIDを調べる

先日、とあるプロセスが暴走していてCPUを食いまくっていた。バッチサーバで各バッチをコンテナで実行しているんだけど、どのプロセスがどのコンテナかを調査する時にPIDからコンテナID(もしくはコンテナIDからPID)を調べる必要がある。 /proc/$PID/cgroup を見るとPIDからコンテナIDがわかるらしいという記事があったので、その方法で調べたりしていたがいちいちコンテナIDを調べて紐付けるのが面倒くさかった。

何かいい方法はないかなと思って、Docker Inspectを見ていると、PIDがあった。あとはフォーマットでいい感じに表示すれば使えそう。

最終的には次のようなコマンドになった。

docker ps -q | xargs docker inspect -f '{{.Config.Hostname}} {{.Config.Image}} {{.Args}} {{.State.Pid}} {{range $p, $conf := .NetworkSettings.Ports}} {{$p}}->{{(index $conf 0).HostPort}} {{end}}'

出力結果はこんなかんじになる。それぞれ、コンテナID、イメージ名、引数、プロセスID、バインドしているポート。という感じにした。

a10b8169f7e1 batch-cli [batch-job-foo] 109442
284d23a4e10b batch-cli [batch-job-bar] 102905
8edc6b9ce586 nginx:1.13.3-alpine [-g daemon off;] 3409  80/tcp->80

docker ps -q でコンテナIDだけ出力して、xargsdocker inspectに渡す。あとはフォーマットで整えるんだけど、コンテナIDはIdというフィールドでいるんだけど、長いのでConfig.Hostnameを使った。もしかしたらホスト名を指定しているコンテナの場合はホスト名が表示されると思うので、そういう場合はIdを使うしかない。本当はヘッダも表示してあげたいし、タブ区切りか表形式にしてあげたいんだけど、\ttableも効かないので諦めた。