【发布时间】:2019-02-13 16:30:18
【问题描述】:
我们使用了很多在 docker 容器中运行的 3rd 方图像 [例如:gitlab、jenkins、centos7 ..]。我想知道如何检查容器中运行的任何应用程序是否以 root 用户身份运行。是否与在普通服务器上检查 ps -elf|grep root 相同,但在容器内。
【问题讨论】:
我们使用了很多在 docker 容器中运行的 3rd 方图像 [例如:gitlab、jenkins、centos7 ..]。我想知道如何检查容器中运行的任何应用程序是否以 root 用户身份运行。是否与在普通服务器上检查 ps -elf|grep root 相同,但在容器内。
【问题讨论】:
您可以将终端连接到正在运行的容器,一旦进入其中,您就可以运行 ps 命令:
附加到容器
$ docker exec -it <container_id> /bin/bash
您可以在官方文档站点中阅读有关 docker exec 的更多信息:https://docs.docker.com/engine/reference/commandline/exec/
希望对你有帮助!
【讨论】:
您可以使用与进程 ID 关联的 docker top 命令... 结合“docker ps”和“docker top”可以使事情..
你可以这样做:
docker ps | perl -ne '@cols = split /\s{2,}/, $_; printf "%15s\n", $cols[0]' > tmp.txt && tail -n $(($(wc -l < tmp.txt)-1)) tmp.txt | xargs -L1 docker top | perl -ne '@cols = split /\s{2,}/, $_; printf "%15s %65s\n", $cols[0], $cols[7]' && rm tmp.txt
这不是一个完美的答案((应该很漂亮),并且还要注意它仅适用于运行容器。在运行容器之前从图像的角度检查这一点会更安全。 然后,每次获取图像时,只需这样检查:
d image inspect <image id> | grep -i user
我可能错了,但我认为没有用户意味着 root。否则,您将不得不在那里分析输出。
【讨论】:
要获取主机上正在运行的容器中的所有进程及其 UID,您可以执行以下操作:
for c in $(docker ps -q); do docker inspect $c -f "{{ .Name }}:"; docker top $c | awk '{print $1, $2, $8}'; echo "--------------"; done
这将打印类似的东西
/webserver-dockerized_nginx_1:
UID PID CMD
root 13437 nginx:
systemd+ 13522 nginx:
systemd+ 13526 nginx:
systemd+ 13527 nginx:
systemd+ 13528 nginx:
--------------
对于您正在运行的所有容器。
要获取主机上所有图像的配置用户,您可以这样做
docker image inspect $(docker image ls -q) -f "{{ .RepoTags }}: {{ .ContainerConfig.User }} {{ .Config.User }}"
这将输出类似
[nginx:mainline-alpine]:
[memcached:alpine]: memcache memcache
[redis:5-alpine]:
正如 Marvin 所说:如果输出中没有用户,则 Dockerfile 中没有定义 USER,因此容器将以 root 身份运行(参考:Docker Documentation)
【讨论】: