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。