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?
172
Antworten:
Der zuverlässigste Weg ist zu überprüfen
/proc/1/cgroup
. Hier erfahren Sie, welche Kontrollgruppen der Init-Prozess enthält. Wenn Sie sich nicht in einem Container befinden, gilt dies/
für alle Hierarchien. Wenn Sie sich in einem Container befinden, wird der Name des Ankerpunkts angezeigt. Mit LXC / Docker - Container, wird es so etwas wie/lxc/<containerid>
oder/docker/<containerid>
sind.quelle
docker
stattlxc
in diesen Pfaden/
für alle cgroups verwendet wird. Auf meinem Debian 9-System (systemd 232) befinden sich nur drei der zehn cgroups (3:cpuset
,4:perf_event
und7:freezer
) an der Wurzel. der Rest ist unter/init.scope
. Trotzdem denke ich, dass das Durchsuchen dieser Datei:/docker/
im Moment wahrscheinlich die zuverlässigste Heuristik ist.grep 'docker\|lxc' /proc/1/cgroup
funktioniert für mich auf Docker 18.09.Docker erstellt eine
.dockerenv
Datei im Stammverzeichnis des Verzeichnisbaums im Container. Sie können dieses Skript zur Überprüfung ausführenMEHR: Ubuntu hat tatsächlich ein Bash-Skript:
/bin/running-in-container
und es kann tatsächlich den Containertyp zurückgeben, in dem es aufgerufen wurde. Könnte hilfreich sein. Ich weiß aber nichts über andere große Distributionen.quelle
.dockerinit
Datei wurde in neueren Versionen von Docker entfernt , sodass diese Methode nicht mehr funktioniert. Zum jetzigen Zeitpunkt wird die.dockerenv
Datei immer noch aufbewahrt, sodass sie möglicherweise stattdessen verwendet werden könnte./bin/running-in-container
wird bereitgestellt vonupstart
. Mit dem Übergang zu systemd könnte es verschwinden. Ich hoffe nicht - es klingt nützlich!.dockerenv
wird nicht empfohlenAuf einem neuen Ubuntu 16.04-System, neues Systemd & lxc 2.0
quelle
Eine kurze Möglichkeit, in einem Bash-Skript nach Docker zu suchen, ist:
quelle
Praktische Python-Funktion, um zu überprüfen, ob sie in Docker ausgeführt wird:
quelle
kubepods
denke ich.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 (einem Nicht-Container-System).
Beispielsweise gibt die Ausgabe von / proc / 1 / sched für einen Container Folgendes zurück:
Auf einem Nicht-Container-Host:
Dies hilft zu unterscheiden, ob Sie sich in einem Container befinden oder nicht.
quelle
sh
und nichtinit
da, aber es kann fast alles in beiden sein.bash-5.0# cat /proc/1/sched bash (1, #threads: 1)
Am einfachsten wäre es, die Umgebung zu überprüfen. Wenn Sie die haben
container=lxc
Variable haben, befinden Sie sich in einem Container.Andernfalls, wenn Sie als root angemeldet sind, können Sie versuchen , auszuführen
mknod
odermount
Betrieb, wenn es ausfällt, Sie sind am ehesten in einem Behälter mit sank Fähigkeiten.quelle
/proc/1/cgroup
dies nicht erkennen können.docker run alpine env
gibt nichts, was wie diese Variable aussiehtMeine Antwort gilt nur für Node.js-Prozesse , kann jedoch für einige Besucher relevant sein, die auf diese Frage stoßen und nach einer Node.js-spezifischen Antwort suchen.
Ich hatte das gleiche Problem und habe
/proc/self/cgroup
mich darauf verlassen, dass ich ein npm-Paket erstellt habe nur zu diesem Zweck - 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 wird derzeit nicht in Io.js getestet, kann aber auch dort funktionieren.
quelle
Suchen Sie in Python nach allen oben genannten Lösungen:
Konzeptioneller Beweiß:
quelle
def is_non_docker(): return os.path.exists('/proc/1/cgroup')
wie pro die akzeptierte Antwort hier stackoverflow.com/questions/20010199/...cat
! Schön :-DDocker entwickelt sich von Tag zu Tag weiter, daher können wir nicht sicher sagen, ob sie
.dockerenv .dockerinit
in Zukunft beibehalten werden.In den meisten Linux-Varianten
init
ist der erste Prozess zu starten. Bei Containern ist dies jedoch nicht der Fall.quelle
init
, was aufsystemd
oderlaunchd
basierend auf Systemen nicht wahr ist ...init
), OpenRC, initng, runit. Siehe hier . Die meisten modernen Linux-basierten Systeme würden verwendensystemd
, einige ältere, Emporkömmling ... Alle modernen OS X-Systeme würden verwendenlaunchd
Diese SO-Fragen und Antworten: "Finden Sie heraus, ob das Betriebssystem in einer virtuellen Umgebung ausgeführt wird" ; Obwohl dies nicht mit der Frage des OP identisch ist, beantwortet es tatsächlich häufige Fälle, in denen festgestellt wird, in welchem Container Sie sich befinden (wenn überhaupt).
Installieren und lesen Sie insbesondere den Code dieses Bash-Skripts, der anscheinend recht gut funktioniert:
virt-what :
quelle
virt-what
Version 1.14-1 unter Ubuntu 16.04. Benötigt Patch.Ich habe JJCs Antwort in Rubin übersetzt
quelle
In einem Docker-Container werden Einträge
/proc/self/cgroup
in cgroups auf dem Host bereitgestellt.zB in einem Behälter
während das gleiche auf dem Host
Verwenden Sie etwas in der Shell für einen Low-Profile-Test
quelle
Vielleicht macht das den Trick:
Ist es das was du willst? Hoffe es hilft =)
quelle
docker
Offensichtlich ist im Inneren des Containers keine Binärdatei verfügbar.docker
Zugriff auf den Docker-Socket des Hosts verfügt.