Comment déterminer si un processus s'exécute dans lxc/Docker ?
Question
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 s'exécutent dans une machine virtuelle, existe-t-il quelque chose de similaire disponible pour lxc/docker ?
La solution
Le moyen le plus fiable est de vérifier /proc/1/cgroup
.Il vous indiquera les groupes de contrôle du processus d'initialisation, et quand vous serez pas dans un conteneur, ce sera /
pour toutes les hiérarchies.Lorsque vous êtes à l'intérieur un conteneur, vous verrez le nom du point d’ancrage.Avec les conteneurs LXC/Docker, ce sera quelque chose comme /lxc/<containerid>
ou /docker/<containerid>
respectivement.
Autres conseils
Docker crée un .dockerenv
fichier à la racine de l’arborescence des 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 matrix ;(";
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 renvoyer le type de conteneur dans lequel il a été invoqué.Cela pourrait être utile.Cependant, je ne connais pas les autres distributions majeures.
sur un nouveau système Ubuntu 16.04, New Systemd & LXC 2.0
sudo grep -qa container=lxc /proc/1/environ
Un moyen concis de vérifier que Docker dans un script Bash est:
#!/bin/bash
if grep docker /proc/1/cgroup -qa; then
echo I'm running on docker.
fi
Fonction python pratique pour vérifier si elle fonctionnait dans 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()
Nous utilisons le PROC SCHAND (/ PROP / $ $ PID / SCHAND) pour extraire le PID du processus.Le PID du processus à l'intérieur du conteneur diffère alors il est pid sur l'hôte (un système non-conteneur).
Par exemple, la sortie de / proc / 1 / programmation sur un conteneur retournera:
root@33044d65037c:~# cat /proc/1/sched | head -n 1
bash (5276, #threads: 1)
pendant 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.
Le moyen le plus simple serait de vérifier l’environnement.Si vous avez le container=lxc
variable, vous êtes dans un conteneur.
Sinon, si vous êtes root, vous pouvez essayer d'effectuer mknod
ou mount
opération, si elle échoue, vous vous trouvez probablement dans un conteneur avec des capacités abandonnées.
Vérifiez toutes les solutions ci-dessus en 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)
Ma réponse ne s'applique que pour Processus Node.Js , mais peut être pertinent pour certains visiteurs qui trébuchent sur cette question à la recherche d'une réponse spécifique nœud.js.
J'ai eu le même problème et j'avais le même problème et j'appuie sur /proc/self/cgroup
j'ai créé un package
the module NPM conteneurisé vous aidera à sortir dans Node.js.Il n'est pas actuellement testé dans io.js mais peut aussi bien y travailler aussi.
Docker évolue de jour en jour, nous ne pouvons donc pas dire avec certitude s'ils continueront .dockerenv .dockerinit
à l'avenir.
Dans la plupart des versions Linux init
est le premier processus à démarrer.Mais dans le cas des conteneurs, ce n’est pas vrai.
#!/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