从容器内部如何判断Docker daemon是否运行在rootless模式
容器内部判断Docker daemon是否运行在rootless模式的方案
前置说明
Docker 20.10及以上版本开始支持rootless模式运行daemon,常规在宿主机判断的方法是执行docker info查看Security Options下是否存在rootless标识,容器内部的判断逻辑可以基于相同的原理扩展,且满足不依赖用户命名空间检测的要求。
方案1:容器内可访问Docker Socket(准确率100%,优先推荐)
该方案与宿主机判断逻辑完全一致,不涉及任何用户命名空间相关的检测:
- 前提条件:容器启动时挂载了Docker Socket
/var/run/docker.sock - 执行逻辑:调用Docker API查询daemon的安全配置项,判断是否包含rootless标识
- 示例脚本:
#!/bin/bash # 检查docker命令是否存在 if ! command -v docker &> /dev/null; then echo "未检测到docker cli,请先安装或直接调用socket接口查询" exit 2 fi # 查询安全选项判断是否为rootless模式 if docker info --format '{{.SecurityOptions}}' | grep -Fq 'rootless'; then echo "当前Docker daemon运行在rootless模式" exit 0 else echo "当前Docker daemon未运行在rootless模式" exit 1 fi
方案2:容器内无法访问Docker Socket
该方案通过cgroup路径特征判断,完全不涉及用户命名空间检测逻辑:
rootless模式下运行的Docker daemon,创建的容器cgroup路径中必然包含运行daemon的普通用户的UID段,格式为user-<非0数字UID>.slice/user@<非0数字UID>.service,而rootful模式的Docker创建的容器不会存在该特征。
- 示例脚本:
#!/bin/bash if grep -Eq 'user-[1-9][0-9]*\.slice/user@[1-9][0-9]*\.service' /proc/self/cgroup; then echo "当前Docker daemon运行在rootless模式" exit 0 else echo "当前Docker daemon未运行在rootless模式" exit 1 fi
提示:该方案准确率略低于方案1,仅适用于无法挂载Docker Socket的场景。
内容的提问来源于stack exchange,提问作者felipecrs
相关产品推荐
相关产品推荐

