Docker:通过共享 PID 命名空间从 UID 获取主机用户名



我正在运行一个具有共享 PID 命名空间的 docker 容器,该容器运行一个 Web 应用程序,该应用程序显示主机上正在运行的进程以允许监视。我正在使用python的psutil库来获取过程详细信息。

问题是,对于用户名,Web 应用在从容器运行时返回 UID 而不是用户名。如果我直接从主机运行它,它会返回正确的用户名。

任何人都可以建议直接或通过UID获取用户名的最佳方法是什么?我需要为所有用户名执行此操作,而不仅仅是我自己的用户名,并且计算机上的用户数量是任意的。

我会将其设置为环境变量并以这种方式引用它。

例如:

docker run -it -e MY_USERNAME=$(whoami) alpine sh
/ # echo $MY_USERNAME
nick
/ #

另一种方法是使用类似的方法强制使用容器名称:

$ echo -en "FROM alpinennRUN adduser -S nicknn" > Dockerfile; docker build . -t example-name; docker run -it -u $(whoami) example-name sh
Sending build context to Docker daemon 2.048 kB
Step 1/2 : FROM alpine
 ---> 88e169ea8f46
Step 2/2 : RUN adduser -S nick
 ---> Running in f0ff1d5a75be
 ---> 916e94b7de6a
Removing intermediate container f0ff1d5a75be
Successfully built 916e94b7de6a
$ whoami
nick

但是,这要求用户出现在映像中;UID 将与主机或跨系统不一致

$ id
uid=1001(nick) gid=1001(nick) groups=1001(nick)
nick@primestorage01:~/Code/playground$ echo -en "FROM alpinennRUN adduser -S nicknn" > Dockerfile; docker build . -t example-name; docker run -it -u     $(whoami) example-name sh
Sending build context to Docker daemon 2.048 kB
Step 1/2 : FROM alpine
 ---> 88e169ea8f46
Step 2/2 : RUN adduser -S nick
 ---> Using cache
 ---> 916e94b7de6a
Successfully built 916e94b7de6a
/ $ id
uid=100(nick) gid=65533(nogroup) groups=65533(nogroup)
/ $

如果这是您要查找的,则应将 su-exec 与强大的配置管理结合使用。

/etc/passwd 文件从主机挂载到容器中,如下所示:

-v /etc/passwd:/etc/passwd:ro

编辑:你甚至可能需要挂载/etc/group...

更新:对于以用户身份监禁(使用 -u $(whoami)(,您需要创建另一个复制实际/etc/passwd 和/etc/group 的映像。

最新更新