有什么方法可以确定一个进程(脚本)是否在lxc容器中运行(~ Docker runtime)?我知道一些程序能够检测它们是否在虚拟机中运行,lxc/docker是否也有类似的功能?


当前回答

在新的ubuntu 16.04系统上,新的systemd和lxc 2.0

sudo grep -qa container=lxc /proc/1/environ

其他回答

Docker每天都在发展,所以我们不能肯定他们将来是否会保留.dockerenv .dockerinit。

在大多数Linux版本中,init是第一个启动的进程。但在容器的情况下,这不是真的。

#!/bin/bash
if ps -p1|grep -q init;then  
  echo "non-docker" 
else 
  echo "docker" 
fi

在docker容器中,条目/proc/self/cgroup被挂载到主机上的cgroups。

比如在容器里

# awk -F: '/cpuset/' /proc/self/cgroup
3:cpuset:/docker/22bd0c154fb4e0d1b6c748faf1f1a12116acc21ce287618a115ad2bea41256b3

而在主机上也是一样的

$ awk -F: '/cpuset/' /proc/self/cgroup
3:cpuset:/

在外壳中使用一些东西进行低调测试

is_running_in_container() {
  awk -F: '/cpuset/ && $3 ~ /^\/$/ { c=1 } END{ exit c }' /proc/self/cgroup
}

if is_running_in_container; then
  echo "Aye!! I'm in a container"
else 
  echo "Nay!! I'm not in a container"
fi

Docker在容器内的目录树的根创建一个.dockerenv文件。这可以通过执行ls -la /命令来查看。Dockerenv来显示它是在容器启动时创建的。

你可以运行这个脚本来验证:

#!/bin/bash
if [ -f /.dockerenv ]; then
    echo "I'm inside matrix ;(";
else
    echo "I'm living in real world!";
fi

更多: Ubuntu实际上有一个bash脚本:/bin/running-in-container,它可以返回被调用的容器类型。可能会有帮助。 不过我不知道其他主要的发行版。

我的回答只适用于Node.js进程,但可能与一些无意中遇到这个问题并寻找Node.js特定答案的访问者相关。

我也遇到了同样的问题,我在/proc/self/cgroup上创建了一个npm包,专门用于检测一个Node.js进程是否在Docker容器中运行。

容器化的npm模块将在Node.js中帮助你。它目前还没有在Io.js中测试,但也可以在那里工作。

最可靠的方法是检查/proc/1/cgroup.它会告诉你init进程的控制组,当你不在容器中时,它会是/ for所有层次结构。当您在容器内时,您将看到锚点的名称。对于LXC/Docker容器,它将分别类似于/ LXC/ <containerid>或/Docker /<containerid>。