有没有办法确定进程(脚本)是否在 lxc 容器(~ Docker 运行时)内运行?我知道有些程序能够检测它们是否在虚拟机内运行,lxc/docker 是否有类似的功能?

有帮助吗?

解决方案

最可靠的方法是检查世代odicetagcode。它会告诉您init进程的控制组,以及在容器中 not 时,这将是所有层次结构的生成icotagcode。当您在一个容器中,您将看到锚点的名称。使用LXC / Docker容器,它将分别是生成的诸如世生古代替代代码或世代odicetagcode。

其他提示

Docker 创建了一个 .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
.

在Bash脚本中检查Docker的简明方法是:

#!/bin/bash
if grep docker /proc/1/cgroup -qa; then
   echo I'm running on docker.
fi
.

Handy 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()
.

我们使用proc的sched(/ proc / $ pid / sched)来提取该过程的PID。该过程的PID在容器内部将不同,然后它在主机上的PID(非容器系统)。

例如,容器上/ proc / 1 / chart的输出 将返回:

root@33044d65037c:~# cat /proc/1/sched | head -n 1
bash (5276, #threads: 1)
. 在非容器主机上的同时:

$ cat /proc/1/sched  | head -n 1
init (1, #threads: 1)
.

如果您在容器中或不具有区分,则会有助于区分。

最简单的方法是检查环境。如果您有 container=lxc 变量,你在一个容器内。

否则,如果你是root,你可以尝试执行 mknod 或者 mount 操作,如果失败,您很可能处于一个功能已被删除的容器中。

检查Python中上面的所有解决方案:

import os
import subprocess

def in_container():
    # type: () -> bool
    """ Determines if we're running in an lxc/docker container. """
    out = subprocess.check_output('cat /proc/1/sched', shell=True)
    out = out.decode('utf-8').lower()
    checks = [
        'docker' in out,
        '/lxc/' in out,
        out.split()[0] not in ('systemd', 'init',),
        os.path.exists('/.dockerenv'),
        os.path.exists('/.dockerinit'),
        os.getenv('container', None) is not None
    ]
    return any(checks)
.

我的答案只适用于 node.js进程,但对于困境的一些访问者可能是相关的,这些访问者正在寻找节点。

我有同样的问题,依赖于世代odicetagcode我创建了一个 npm包,以仅为这个目的 - 来检测node.js进程是否在Docker容器内运行。

集装式npm模块将在node.js中帮助您。它目前尚未在IO.JS中进行测试,但也可能在那里工作。

Docker 正在日新月异地发展,所以我们不能确定它们是否会继续存在 .dockerenv .dockerinit 将来。

在大多数 Linux 版本中 init 是第一个启动的进程。但对于容器来说,情况并非如此。

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

Building on the accepted answer that tests /proc/*/cgroup ..

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

So for use in a script or so, a test could be constructed this way.

is_running_in_container() {
  awk -F: '$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

This SO Q&A: "Find out if the OS is running in a virtual environment"; though not the same as the OP's question, it does indeed answer common cases of finding which container you're in (if at all).

In particular, install and read the code of this bash script which seems to work pretty well:

virt-what :

sudo apt install virt-what

I have translated JJC's answer into ruby

def in_docker
  File.open('/proc/1/cgroup', 'rt') do |f|
    contents = f.read
    return contents =~ /docker/i || contents =~ /kubepod/i
  end
rescue StandardError => e
  p 'Local development'
  p e
  false
end

Maybe this do the trick:

if [ -z $(docker ps -q) ]; then
    echo "There is not process currently running"
else
    echo "There are processes running"
fi
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top