如何查看哪个用户启动了Docker容器?

时间:2018-05-27 05:42:25

标签: docker

我可以使用docker psequivalently docker container ls查看正在运行的容器列表(在Docker 1.13中添加)。但是,它不会显示启动每个Docker容器的用户。如何查看哪个用户启动了Docker容器?理想情况下,我希望将运行容器列表与用户一起启动,以便启动每个容器。

6 个答案:

答案 0 :(得分:2)

你可以试试这个;

func textView(_ textView: UITextView, shouldInteractWith URL: URL, 
    in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool

编辑:添加到输出的容器名称

答案 1 :(得分:1)

如果您习惯ps命令,则在Docker主机上运行ps,并在进程正在运行的部分过程中运行grep。例如,如果运行了Tomcat容器,则可以运行以下命令以获取有关哪个用户启动容器的详细信息。

ps -u | grep tomcat 

这是可能的,因为容器只是由docker管理的进程。但是,这只适用于单个主机。 Docker提供了获取容器详细信息的替代方法,如其他答案中所述。

答案 2 :(得分:1)

据我所知,docker inspect仅显示 容器开始于。

由于诸如entrypoint(或任何初始化脚本)之类的命令可能会更改用户,因此这些更改不会反映在docker inspect输出中。

要解决此问题,您可以使用
--entrypoint=""覆盖图像设置的默认入口点,并在其后指定一个命令,例如whoamiid

您专门要求查看所有正在运行的容器以及已启动的用户,因此,此解决方案仅是部分解决方案,可以为您提供用户,以防它不出现在docker inspect命令中:

docker run --entrypoint "" <image-name> whoami

也许有人会从这一点着手寻求一个完整的解决方案(:


here中了解有关entrypoint ""的更多信息。

答案 3 :(得分:1)

我找到了解决方案。它并不完美,但对我有用。

我使用包含用户的环境变量(在我的例子中为 $CONTAINER_OWNER)启动我的所有容器。然后,我可以列出带有环境变量的容器。

使用环境变量启动容器

docker run -e CONTAINER_OWNER=$(whoami) MY_CONTAINER

使用环境变量启动 docker compose

echo "CONTAINER_OWNER=$(whoami)" > deployment.env # Create env file
docker-compose --env-file deployment.env up

列出带有环境变量的容器

for container_id in $(docker container ls -q); do
    echo $container_id $(docker exec $container_id bash -c 'echo "$CONTAINER_OWNER"')
done

答案 4 :(得分:1)

没有内置的方法可以做到这一点。

您可以通过检查容器中的 .Config.User 字段来检查用户是否将容器内的应用程序配置为运行方式,如果它为空,则默认值为 uid 0 (root)。但这并不能告诉您是谁运行了启动容器的 docker 命令。具有 docker 访问权限的用户 bob 可以作为任何 uid 运行容器(这是作为 uid 1234 运行的 docker run -u 1234 some-image 选项)。无论启动容器的用户如何,大多数尚未强化的映像将默认以 root 身份运行。

要理解为什么,要意识到 docker 是一个客户端/服务器应用程序,服务器可以通过不同的方式接收连接。默认情况下,此服务器以 root 身份运行,用户可以使用任何配置提交请求。这些请求可能通过 unix 套接字,您可以 sudo 到 root 以连接到该套接字,您可以将 API 暴露给网络(不推荐),或者您可能在 docker 之上有另一层工具(例如 Kubernetes 与码头工人)。该列表中的大问题是网络请求与 unix 套接字之间的区别,因为网络请求不会告诉您谁在远程主机上运行,​​如果确实如此,您将信任该远程客户端提供准确的信息.由于 API 已记录在案,任何拥有 curl 命令的人都可以提交声称是其他用户的请求。

简而言之,每个有权访问 docker API 的用户都是您主机上的匿名 root 用户。


你能得到的最接近的方法是在 docker 前面放置一些东西来验证用户并填充诸如标签之类的东西。或者信任用户填充该标签并诚实(因为 docker 中没有任何内容验证这些设置)。

$ docker run -l "user=$(id -u)" -d --rm --name test-label busybox tail -f /dev/null
...
$ docker container inspect test-label --format '{{ .Config.Labels.user }}'
1000

除此之外,如果您有一个已部署的容器,有时您可以通过查看配置并找到回到该用户主目录的卷映射来推断用户。这给了您很大的可能性,但同样不能保证,因为任何用户都可以设置任何音量。

答案 5 :(得分:0)

 ps -aux | less

在列表(最后一列)中找到进程的名称(在容器内运行的名称),您将看到用户在第一列中运行了它