如何让Shell脚本检测自身是否运行在Docker容器中?
如何编写Shell脚本检测是否运行在容器环境中
要判断Shell脚本是否运行在容器环境里,可通过容器特有的系统特征来实现,以下是几种可靠的判断逻辑及完整脚本:
常见判断依据
- 检查是否存在Docker专属的
.dockerenv文件(仅适用于Docker容器) - 查看
/proc/1/cgroup文件内容,是否包含docker、containerd、kubelet等容器相关标识 - 检查
/proc/1/sched的第一行进程名,容器内PID为1的进程通常不是主机的init或systemd
综合判断的完整脚本
#!/bin/sh # 综合多种方式判断是否在容器环境中 is_container() { # 检查Docker专属文件 [ -f /.dockerenv ] && return 0 # 检查cgroup内容 grep -qE 'docker|containerd|kubelet' /proc/1/cgroup 2>/dev/null && return 0 # 检查PID 1的进程名 local pid1_name=$(head -n1 /proc/1/sched | awk '{print $1}') [ "$pid1_name" != "init" ] && [ "$pid1_name" != "systemd" ] && return 0 return 1 } if is_container; then echo 'running in container' else echo 'running on host' fi
说明
- 单一判断方式可能存在误判(比如部分主机环境也会有类似cgroup内容),综合多种方式能提升检测准确性
- 脚本兼容
sh、bash等常见Shell环境,无需额外依赖
内容的提问来源于stack exchange,提问作者lonix
相关产品推荐
相关产品推荐

