语境:
- 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
可执行路径以获得您想要的内容。