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

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

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

任何人都可以build议什么是直接或通过UID得到用户名的最佳方式? 我需要为所有用户名执行此操作,而不仅仅是我自己的操作,而且机器上的用户数是任意的。

我将它设置为一个环境variables,并参考它的方式。

例如:

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

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

 $ echo -en "FROM alpine\n\nRUN adduser -S nick\n\n" > 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 alpine\n\nRUN adduser -S nick\n\n" > 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结合健壮的configurationpipe理。

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

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

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

更新:作为一个用户的监狱(使用-u $(whoami) ),您将需要创build另一个映像复制实际的/ etc / passwd和/ etc / group。