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

7gs2gvoe  于 2022-12-29  发布在  Docker
关注(0)|答案(7)|浏览(330)

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

flseospp

flseospp1#

你可以试试这个;

docker inspect $(docker ps -q) --format '{{.Config.User}} {{.Name}}'

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

zfciruhq

zfciruhq2#

没有内置的方法来做到这一点。
您可以通过检查容器中的.Config.User字段来检查容器中的应用程序配置为以哪个用户身份运行,如果为空,则默认值为uid 0但是这并不告诉您是谁运行了启动容器的docker命令。具有docker访问权限的用户bob可以以任何uid运行容器(这是docker run -u 1234 some-image选项,以uid 1234运行)。大多数未被硬化的映像将默认以root身份运行,无论启动容器的用户是谁。
要理解其中的原因,请了解Docker是一个客户端/服务器应用程序,服务器可以通过不同的方式接收连接。默认情况下,此服务器以root身份运行,用户可以使用任何配置提交请求。这些请求可能通过unix套接字发送,您可以对root执行sudo操作以连接到该套接字,您可以将API公开给网络(不推荐),或者您可能在Docker上有另一层工具(例如,带有docker-shim的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

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

nkhmeac6

nkhmeac63#

我找到了一个解决办法。虽然不完美,但对我很有效。
我用一个包含用户的环境变量(在我的例子中是$CONTAINER_OWNER)启动所有容器,然后,我可以用这个环境变量列出容器。

使用环境变量启动容器

docker run -e CONTAINER_OWNER=$(whoami) MY_CONTAINER

使用环境变量启动Docker合成

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
ar7v8xwq

ar7v8xwq4#

据我所知,docker inspect将只显示容器开始时的配置。
由于entrypoint之类的命令(或任何init脚本)可能会更改用户,因此这些更改不会反映在docker inspect输出中。
为了解决此问题,可以使用重写映像设置的默认入口点
--entrypoint="",并在其后指定类似whoamiid的命令。
您特别要求查看所有正在运行的容器和启动的用户,因此此解决方案只是部分解决方案,如果docker inspect命令没有显示用户,则会提供用户:

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

也许有人会从这一点出发,提出一个完整的解决方案(:
在这里阅读更多关于entrypoint ""的信息。

oyjwcjzk

oyjwcjzk5#

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

ps -u | grep tomcat

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

0sgqnhkj

0sgqnhkj6#

此命令将打印uid和gid docker exec <CONTAINER_ID> id

yyyllmsg

yyyllmsg7#

ps -aux | less

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

相关问题