【问题标题】:How can I see which user launched a Docker container?如何查看哪个用户启动了 Docker 容器?
【发布时间】:2021-07-24 05:26:15
【问题描述】:

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

【问题讨论】:

    标签: docker


    【解决方案1】:

    你可以试试这个;

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

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

    【讨论】:

    • 当我运行命令时,我有 6 个容器为 laravel 运行,我在答案上发布了我只得到 2 个由 root 运行的容器。但是在其他容器上我没有得到任何结果,因为它们可能会 depend on 其他容器,这就是我的情况。
    • 谢谢。如果容器 A 依赖于容器 B,为什么会导致容器 A 没有与之关联的用户?
    • 他们实际上是作为用户“nobody”运行的
    • 我很确定这是不正确的。用户是运行容器的用户。不是启动容器的用户(是否 docker run... 命令)
    【解决方案2】:

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

    您可以通过检查容器中的.Config.User 字段来检查容器内的应用程序配置为运行的用户,如果它为空,则默认为uid 0(root)。但这并不能告诉你是谁运行了启动容器的 docker 命令。有权访问 docker 的用户 bob 可以将容器作为任何 uid 运行(这是 docker run -u 1234 some-image 以 uid 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
    

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

    【讨论】:

    • 不幸的是,这似乎是问题的正确答案。
    【解决方案3】:

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

    我使用包含用户的环境变量(在我的情况下为 $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】:

    据我所知,docker inspect 只会显示配置 容器开始于。

    因为entrypoint(或任何初始化脚本)之类的命令可能会改变用户,所以这些改变不会反映在docker inspect 输出中。

    为了解决这个问题,您可以使用
    --entrypoint="" 覆盖图像设置的默认入口点,并在其后指定类似 whoamiid 的命令。

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

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

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


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

    【讨论】:

      【解决方案5】:

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

      ps -u | grep tomcat 
      

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

      【讨论】:

        【解决方案6】:
         ps -aux | less
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-12-21
          • 1970-01-01
          • 1970-01-01
          • 2013-09-03
          • 1970-01-01
          • 2014-06-22
          • 2018-05-29
          相关资源
          最近更新 更多