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


当前回答

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

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

#!/bin/bash
if ps -p1|grep -q init;then  
  echo "non-docker" 
else 
  echo "docker" 
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,它可以返回被调用的容器类型。可能会有帮助。 不过我不知道其他主要的发行版。

在新的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

这个SO问答:“找出操作系统是否在虚拟环境中运行”;虽然与OP的问题不一样,但它确实回答了找到你所在容器的常见情况(如果有的话)。

特别是,安装并阅读这个bash脚本的代码,它似乎工作得很好:

virt-what:

sudo apt install virt-what

方便的Python函数检查是否运行在Docker:

def in_docker():
    """ Returns: True if running in a Docker container, else False """
    with open('/proc/1/cgroup', 'rt') as ifh:
        return 'docker' in ifh.read()