有什么方法可以确定一个进程(脚本)是否在lxc容器中运行(~ Docker runtime)?我知道一些程序能够检测它们是否在虚拟机中运行,lxc/docker是否也有类似的功能?
当前回答
最可靠的方法是检查/proc/1/cgroup.它会告诉你init进程的控制组,当你不在容器中时,它会是/ for所有层次结构。当您在容器内时,您将看到锚点的名称。对于LXC/Docker容器,它将分别类似于/ LXC/ <containerid>或/Docker /<containerid>。
其他回答
最简单的方法是检查环境。如果你有container=lxc变量,你就在一个容器中。
否则,如果您是根用户,您可以尝试执行mknod或mount操作,如果失败,则很可能处于已删除功能的容器中。
在bash脚本中检查docker/lxc的一个简单方法是:
#!/bin/bash
if grep -sq 'docker\|lxc' /proc/1/cgroup; then
echo "I am running on Docker."
fi
这是Ruby中的一个解决方案,
# Usage: DockerHelper.running_in_docker?
module DockerHelper
extend self
def running_in_docker?
!!(File.read("/proc/1/cgroup") =~ %r[^\d+:\w+:/docker/]) # !! => true/false
rescue Errno::ENOENT
false
end
end
如果您喜欢对代码进行测试,这里有一个要点说明。
最可靠的方法是检查/proc/1/cgroup.它会告诉你init进程的控制组,当你不在容器中时,它会是/ for所有层次结构。当您在容器内时,您将看到锚点的名称。对于LXC/Docker容器,它将分别类似于/ LXC/ <containerid>或/Docker /<containerid>。
我们使用进程的调度(/proc/$PID/sched)来提取进程的PID。容器内进程的PID与主机上的PID不同(非容器系统)。
例如,容器上的/proc/1/sched的输出 将返回:
root@33044d65037c:~# cat /proc/1/sched | head -n 1
bash (5276, #threads: 1)
在非容器主机上:
$ cat /proc/1/sched | head -n 1
init (1, #threads: 1)
这有助于区分您是否在容器中。
推荐文章
- 安装tzdata非交互式
- 在Bash中检查变量是否存在于列表中
- 查看PS命令的全部输出
- 确保一次只运行一个shell脚本实例的快速方法
- 如何在Windows命令提示符下运行.sh ?
- 如何从命令行将每两行合并为一行?
- 如何复制在bash所有目录和文件递归?
- Linux命令将域名转换为IP
- 试图连接到https://index.docker.io时,网络超时
- 如何从命令行在windows中找到mysql数据目录
- 在Bash命令提示符上添加git分支
- 匹配前后的Grep字符?
- 为每个Docker图像查找图层和图层大小
- 如何避免在为Python项目构建Docker映像时重新安装包?
- 带有多个条件的Bash if语句将抛出错误