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

Fra*_*urt 7 docker

我可以使用docker ps等效 方式查看正在运行的容器的列表docker container ls (已在Docker 1.13中添加)。但是,它不会显示启动每个Docker容器的用户。如何查看哪个用户启动了Docker容器?理想情况下,我希望拥有正在运行的容器的列表以及用于启动每个容器的用户。

BMi*_*tch 23

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

您可以通过检查容器中的字段来检查用户容器内的应用程序是否配置为运行.Config.User,如果该字段为空,则默认值为 uid 0(根)。但这并不能告诉您谁运行了启动容器的 docker 命令。有权访问 docker 的用户 bob 可以以任何 uid 运行容器(这是以docker run -u 1234 some-imageuid 1234 运行的选项)。无论启动容器的用户是谁,大多数尚未强化的映像都将默认以 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
Run Code Online (Sandbox Code Playgroud)

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


Alw*_*win 7

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

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

使用环境变量启动容器

docker run -e CONTAINER_OWNER=$(whoami) MY_CONTAINER
Run Code Online (Sandbox Code Playgroud)

使用环境变量启动 docker compose

echo "CONTAINER_OWNER=$(whoami)" > deployment.env # Create env file
docker-compose --env-file deployment.env up
Run Code Online (Sandbox Code Playgroud)

列出具有环境变量的容器

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


Ana*_*mov 6

您可以尝试一下;

docker inspect $(docker ps -q) --format '{{.Config.User}} {{.Name}}'
Run Code Online (Sandbox Code Playgroud)

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

  • 我很确定这是不正确的。用户是运行容器的用户。不是启动容器的用户(docker run ...命令) (2认同)