如何识别Docker容器运行的宿主机系统 能否将Docker daemon标签传入容器
解决方案
你可以通过Docker daemon全局默认配置实现需求,全程不需要修改容器启动参数、不需要挂载任何文件、不需要暴露/var/run/docker.sock,配置一次全局生效。
方案1:Daemon全局注入daemon标签与宿主机信息(最适配需求)
该方案利用Docker官方内置的默认环境变量配置能力,将需要传递的daemon标签、宿主机系统信息配置为所有容器启动时自动注入的全局环境变量:
- 第一步:编辑Docker daemon配置文件
Linux环境下编辑/etc/docker/daemon.json,Windows/macOS环境直接在Docker Desktop设置的「Docker Engine」页编辑配置:{ // 你的Docker daemon自定义标签 "labels": [ "daemon_zone=east", "daemon_business=payment" ], // 所有容器自动注入的默认环境变量 "default-env": [ "DAEMON_ZONE=east", "DAEMON_BUSINESS=payment", "HOST_OS=ubuntu22.04" // 填入当前宿主机的系统标识,可提前在宿主机执行`grep '^PRETTY_NAME=' /etc/os-release | cut -d '=' -f2 | tr -d '"'`获取 ] } - 第二步:重启Docker daemon生效
Linux执行systemctl restart docker,Windows/macOS直接重启Docker Desktop即可。 - 第三步:容器内部直接读取环境变量即可获取对应信息,不需要任何额外配置:
# 获取daemon标签 echo $DAEMON_ZONE # 获取宿主机系统信息 echo $HOST_OS
该配置对daemon上所有新启动的容器生效,docker-compose部署的容器也会自动继承这些环境变量,完全不需要修改
docker-compose.yml文件。
方案2:容器内部无配置识别宿主机系统
如果你只需要识别宿主机系统类型,不需要传递自定义daemon标签,可以直接在容器内部读取内核信息实现,不需要任何外部配置:
# Shell示例代码 if grep -q "WSL2" /proc/version; then HOST_OS="windows" elif grep -q "LinuxKit" /proc/version; then HOST_OS="macos" else HOST_OS=$(grep '^ID=' /etc/os-release | cut -d '=' -f2 | tr -d '"') fi echo "宿主机系统为:$HOST_OS"
- Windows WSL2环境的Docker启动的容器,
/proc/version会携带WSL2标识 - macOS Docker Desktop启动的容器,
/proc/version会携带LinuxKit标识 - 原生Linux宿主机启动的容器,直接读取
/etc/os-release即可匹配到宿主机发行版信息
内容的提问来源于stack exchange,提问作者Datz。
相关产品推荐
相关产品推荐

