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

时间:2017-05-12 17:18:12

标签: python docker

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

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

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

2 个答案:

答案 0 :(得分:0)

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

EG:

if (!function_exists('SendSMS')) {
    function SendSMS (...) {
    }
}

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

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

然而,这要求用户出现在图像中; UID将与主机或跨系统保持一致。

$ 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

如果您正在寻找此功能,则应将su-exec与强大的配置管理结合使用。

答案 1 :(得分:0)

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

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

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

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