すでに実行中のコンテナがあるとしてそのコンテナにデバッグコマンドが一つも入ってないケースを想定。
この場合はコンテナに入ってパッケージマネージャを使用してデバッグツールを入れる方法もあるがそれすらもかなわない状況だったとする。
そんな時に使えるオプションが--pid=container:
で実行中のコンテナと新たに起動したコンテナでpid namespaceを共有する方法。
サイドカーパターンの文脈に登場したりするテクニック
適当にnginxコンテナを走らせてみる
docker container run -d nginx
次にpidオプションを指定して先ほどあげたnginxコンテナのコンテナIDを指定してみる
docker container run -it --pid=container:bc3c1d8e8996 bash
psでプロセスを確認
bash-5.0# ps aux PID USER TIME COMMAND 1 root 0:00 nginx: master process nginx -g daemon off; 6 101 0:00 nginx: worker process 7 root 0:00 bash 12 root 0:00 ps aux
あとはstraceでpidにアタッチするなりすればデバッグすることが可能になる。
procファイルシステムでnsを確認しても同一のものとなっていることが確認できる。
# コンテナごとのPIDを取得 [root@choco01 ~]# docker container inspect -format="{{ .State.Pid }}" bc3c1d8e8996 ormat=17050 [root@choco01 ~]# docker container inspect -format="{{ .State.Pid }}" 5e1d3acb0352 ormat=17646 # nsを覗いてみる [root@choco01 ~]# ls -l /proc/17646/ns/pid lrwxrwxrwx. 1 root root 0 3月 23 23:11 /proc/17646/ns/pid -> pid:[4026532457] [root@choco01 ~]# ls -l /proc/17050/ns/pid lrwxrwxrwx. 1 root root 0 3月 23 23:05 /proc/17050/ns/pid -> pid:[4026532457]
参考文献