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