🐳
シェルのないコンテナの中に入る方法
distrolessやDockerSlimで作成したコンテナイメージにはシェルがなく、docker exec -it <container> sh
ができない。
そういう場合に無理やり入る方法を紹介する。
dockerの場合
ここに書いてある方法でよい。
docker run --rm -it --pid=container:<target container> --net=container:<target container> --cap-add sys_admin prom/busybox:glibc sh
ターゲットのコンテナがmuslベースならalpine
でいいが、glibcベースならprom/busyboxがいいと思う。
入ったらps
してターゲットコンテナのメインプロセスIDを特定し、/proc/<pid>/root
からターゲットコンテナのファイルシステムにアクセスしたり、strings /proc/<pid>/environ
して環境変数を覗いたりできる。
しかし注意点があり、メインプロセスのユーザがroot
でない場合は/proc/<pid>
の中を覗くことができない。その場合は--privileged
を利用する。
docker run --rm -it --pid=container:<target container> --net=container:<target container> --privileged prom/busybox:glibc sh
k8sの場合
ここに書いてある方法でよい。原理はdockerの場合と同じ。
spec:
shareProcessNamespace: true
containers:
- name: nginx
image: nginx
- name: sidecar
image: prom/busybox:glibc
securityContext:
capabilities:
add:
- SYS_PTRACE
stdin: true
tty: true
shareProcessNamespace: true
が--pid=container:<target container>
に相当する。
Pod内ではネットワークはもともと共有されている。
例によって、メインプロセスのユーザがroot
でない場合は/proc/<pid>
の中を覗くことができない。--privileged
相当は以下の通り。
securityContext:
privileged: true
これができるかどうかはk8sの設定次第。
Discussion