it-swarm.com.de

Wie kann ich feststellen, ob ein Prozess in lxc / Docker ausgeführt wird?

Gibt es eine Möglichkeit, festzustellen, ob ein Prozess (Skript) in einem LXC-Container ausgeführt wird (~ Docker-Laufzeit)? Ich weiß, dass einige Programme erkennen können, ob sie in einer virtuellen Maschine ausgeführt werden. Ist etwas Ähnliches für lxc/docker verfügbar?

142
Mate Varga

Der zuverlässigste Weg ist, /proc/1/cgroup. Es werden Ihnen die Kontrollgruppen des Init-Prozesses mitgeteilt, und wenn Sie sich nicht in einem Container befinden, ist das / für alle Hierarchien. Wenn Sie inside ein Container sind, sehen Sie den Namen des Ankerpunkts. Mit LXC/Docker-Containern wird es so etwas wie /lxc/<containerid> oder /docker/<containerid> beziehungsweise.

144
jpetazzo

Docker erstellt ein .dockerenv Datei im Stammverzeichnis des Verzeichnisbaums im Container. Sie können dieses Skript zur Überprüfung ausführen

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


MORE: Ubuntu hat tatsächlich ein Bash-Skript: /bin/running-in-container und es kann tatsächlich den Typ des Containers zurückgeben, in dem es aufgerufen wurde. Könnte hilfreich sein. Keine Ahnung von anderen großen Distributionen.

139
at0S

Auf einem neuen Ubuntu 16.04-System ist das neue systemd & lxc 2.0

Sudo grep -qa container=lxc /proc/1/environ
17
larss

Eine kurze Möglichkeit, in einem Bash-Skript nach Dockern zu suchen, ist:

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

Praktische Python Funktion, um zu überprüfen, ob sie in Docker ausgeführt wird:

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()
12
JJC

Wir verwenden den Zeitplan des Prozesses (/ proc/$ PID/sched), um die PID des Prozesses zu extrahieren. Die PID des Prozesses im Container unterscheidet sich von der PID auf dem Host (ein Nicht-Container-System).

Beispielsweise gibt die Ausgabe von/proc/1/sched für einen Container Folgendes zurück:

[email protected]:~# cat /proc/1/sched | head -n 1
bash (5276, #threads: 1)

Auf einem Nicht-Container-Host:

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

Dies hilft zu unterscheiden, ob Sie sich in einem Container befinden oder nicht.

9
Founder

Am einfachsten ist es, die Umgebung zu überprüfen. Wenn Sie die Variable container=lxc Haben, befinden Sie sich in einem Container.

Andernfalls können Sie als Root versuchen, mknod oder mount auszuführen. Wenn dies fehlschlägt, befinden Sie sich höchstwahrscheinlich in einem Container mit fehlgeschlagenen Funktionen.

6
creack

Suchen Sie in Python nach allen oben genannten Lösungen:

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)
5
blakev

Meine Antwort gilt nur für Node.js-Prozesse , ist jedoch möglicherweise für einige Besucher relevant, die auf diese Frage stoßen und nach einer Node.js-spezifischen Antwort suchen.

Ich hatte das gleiche Problem und vertraue auf /proc/self/cgroup Ich habe ausschließlich zu diesem Zweck ein npm-Paket erstellt, um festzustellen, ob ein Node.js-Prozess in einem Docker-Container ausgeführt wird oder nicht.

Das containerisierte npm-Modul hilft Ihnen in Node.js. Es ist derzeit nicht in Io.js getestet, kann aber genauso gut dort funktionieren.

3
Martin Tajur

Docker entwickelt sich Tag für Tag weiter, daher können wir nicht sicher sagen, ob sie in Zukunft .dockerenv .dockerinit Behalten werden.

In den meisten Linux-Versionen ist init der erste Prozess, der gestartet wird. Bei Containern ist dies jedoch nicht der Fall.

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

Aufbauend auf der akzeptierten Antwort, die /proc/*/cgroup ..

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

Für die Verwendung in einem Skript könnte ein Test auf diese Weise erstellt werden.

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
1
shalomb

Ich habe die Antwort von JJC in Ruby übersetzt

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
0
Souradeep Nanda

Dies ist SO F & A: "Finden Sie heraus, ob das Betriebssystem in einer virtuellen Umgebung ausgeführt wird" ; obwohl es nicht mit der Frage des OP identisch ist, beantwortet es in der Tat häufige Fälle von Finden, in welchem ​​Container du bist (wenn überhaupt).

Installieren und lesen Sie insbesondere den Code dieses Bash-Skripts, der ziemlich gut zu funktionieren scheint:

virt-what :

Sudo apt install virt-what
0
kaiwan