Comment déterminer si un processus s’exécute dans lxc / Docker?

Existe-t-il un moyen de déterminer si un processus (script) s’exécute dans un conteneur lxc (~ runtime Docker)? Je sais que certains programmes sont capables de détecter s’ils fonctionnent dans une machine virtuelle, est-ce que quelque chose de similaire est disponible pour lxc / docker?

Le moyen le plus fiable est de vérifier /proc/1/cgroup . Il vous indiquera les groupes de contrôle du processus init et, lorsque vous n’êtes pas dans un conteneur, cela sera / pour toutes les hiérarchies. Lorsque vous êtes à l’ intérieur d’ un conteneur, vous verrez le nom du point d’ancrage; qui, avec les conteneurs LXC / Docker, sera respectivement quelque chose comme /lxc/ ou /docker/ .

Docker crée un fichier .dockerenv à la racine de l’arborescence de répertoires à l’intérieur du conteneur. Vous pouvez exécuter ce script pour vérifier

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

PLUS: Ubuntu a en fait un script bash: /bin/running-in-container et il peut en fait retourner le type de conteneur dans lequel il a été appelé. Cela pourrait être utile. Je ne sais pas à propos d’autres distros majeurs cependant.

Sur un nouveau système ubuntu 16.04, new systemd & lxc 2.0

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

Le plus simple serait de vérifier l’environnement. Si vous avez la variable container=lxc , vous êtes dans un conteneur.

Sinon, si vous êtes root, vous pouvez essayer d’effectuer mknod ou opération de mount , si cela échoue, vous êtes probablement dans un conteneur avec des capacités mknod .

Un moyen concis pour rechercher le docker dans un script bash est:

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

Nous utilisons le programme de proc (/ proc / $ PID / sched) pour extraire le PID du processus. Le PID du processus à l’intérieur du conteneur diffère alors de son PID sur l’hôte (un système autre qu’un conteneur).

Par exemple, la sortie de / proc / 1 / sched sur un conteneur renverra:

 root@33044d65037c:~# cat /proc/1/sched | head -n 1 bash (5276, #threads: 1) 

Sur un hôte non conteneur:

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

Cela aide à différencier si vous êtes dans un conteneur ou non.

Fonction Python pratique pour vérifier si Docker est exécuté (Linux uniquement, obvs.):

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

Ma réponse ne concerne que les processus Node.js, mais peut être pertinente pour certains visiteurs qui se heurtent à cette question en recherchant une réponse spécifique à Node.js.

J’ai eu le même problème et en me basant sur /proc/self/cgroup j’ai créé un paquet npm uniquement à cette fin – pour détecter si un processus Node.js s’exécute ou non dans un conteneur Docker.

Le module npm conteneurisé vous aidera dans Node.js. Il n’est pas actuellement testé dans Io.js mais peut aussi bien fonctionner là aussi.

Docker évolue de jour en jour, donc nous ne pouvons pas dire avec certitude s’ils vont garder .dockerenv .dockerinit à l’avenir.

Dans la plupart des versions de Linux, init est le premier processus à démarrer. Mais dans le cas de conteneurs, ce n’est pas vrai.

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

Vérifiez toutes les solutions ci-dessus dans 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) 

S’appuyant sur la réponse acceptée qui teste /proc/*/cgroup ..

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

Donc, pour une utilisation dans un script, un test peut être construit de cette façon.

 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 

Ce SO Q & A: “Découvrez si le système d’exploitation fonctionne dans un environnement virtuel” ; Bien que ce ne soit pas la même que la question de l’OP, il répond effectivement aux cas courants de recherche du conteneur dans lequel vous vous trouvez (voire pas du tout).

En particulier, installez et lisez le code de ce script bash qui semble fonctionner plutôt bien:

virt-quoi :

 sudo apt install virt-what 

Peut-être que ça fait l’affaire:

 if [ -z $(docker ps -q) ]; then echo "There is not process currently running" else echo "There are processes running" fi 

Est-ce que c’est ce que tu veux? Aidez-le à aider =)