获取容器 PID 可执行文件在主机上的绝对路径

获取容器 PID 可执行文件在主机上的绝对路径

语境:

  • CentOS 7 主机
  • Ubuntu 容器
  • Dockerfile:
FROM ubuntu
ENTRYPOINT ["/bin/bash"]

观察:

构建并运行上述容器后,将在 CentOS 主机上的适当命名空间中启动一个新的 bash 进程。

这不会是/bin/bash来自主机的实例,而是已安装的容器映像内的 bash 可执行文件的实例。

/bin/bash例如,容器中运行的进程真的/var/lib/docker/overlay2/<hash>/merged/bin/bash在主机上运行吗?

我的问题:

从主机,如何获取容器进程的给定主机 PID 的可执行文件的绝对路径?

调查:

我目前通过将以下内容拼凑在一起来映射 PID 到可执行绝对路径:

  • lsns或中发现主机 PIDps
  • 主机df输出类似/var/lib/docker/overlay2/<hash>/
    • <hash>从主机抓取/proc/<PID>/task/<PID>/mounts
    • df通常只是观察启动容器时的变化......
  • 容器 ENTRYPOINT 或容器/proc/1/exe

当运行时,只有很少的容器进程起作用,从而允许手动跟踪上述内容。

有没有办法实现自动化?我知道这docker container inspect可以让安装变得<hash>更容易一些。

流程记录在这里当 Docker 使用时可能会工作aufs,但overlay2它只会为我打印容器路径,而不是绝对主机路径。

答案1

使用以下命令可以轻松提取合并的目录: mergeddir=$(docker inspect container_name | grep merged | cut -f 4 -d '"')

接下来,连接$mergeddir可执行路径以获得您想要的内容。

相关内容