Docker: 容器内无法运行 Unix 的 "who" 命令

3

我有一个Docker镜像,其中创建了一个名为builder的非root用户。

应该在容器内运行的应用程序使用unix who命令。

由于某种原因,在容器内它返回一个空字符串:

builder@2dc3831c558b:~$ who
builder@2dc3831c558b:~$

由于实现细节的原因,我无法使用whoami命令。

(我正在Debian Jessie上使用Docker 1.6.2)

编辑(关于为什么使用“who”命令的其他细节)

我使用带有参数am iwho命令,也就是who am i。这应该返回最初进行登录的用户。例如,sudo who am i返回builder,而sudo whoami返回root


1
命令who显示谁已经登录。我猜测容器无法识别用户是否已登录,但实际上我和你一样惊讶。你尝试过运行ssh服务器,通过ssh登录,并运行who命令吗? - undefined
@Auzias 你是对的,如果我运行ssh服务器,who命令就可以工作了。谢谢! - undefined
1个回答

3

who命令 包含像 -b 这样的选项:最后一次系统引导时间。

由于容器中的所有命令都转换为内核的系统调用,因此不会返回任何与容器相关的内容,而是与docker主机有关(即底层主机)。

另请参见 "who和whoami命令之间的区别":whoami 打印正在运行的用户的有效用户名,这与who(打印当前已登录用户的信息)不同。

问题18547中列出的当前解决方法为:

注册表配置存储在客户端中,因此诸如 cat ~/.docker/config.json 这样的简单命令将为您提供您要查找的答案。

docker info | grep Username 应该提供这些信息。

但这与在容器会话中运行命令不同。 id -u 可能更接近。

默认情况下,在使用docker守护程序启动容器时没有直接登录记录。正如Auzias评论中所述,只有直接ssh连接(启动登录会话)才能使 who 返回任何内容。但是在docker中,通常不需要这样做,因为存在docker exec(用于调试目的),该命令可以避免镜像维护者包含ssh,除非确实需要它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接