Existe-t-il un moyen de déterminer si un processus (script) s'exécute dans un conteneur lxc (~ Docker runtime)? Je sais que certains programmes sont capables de détecter s'ils s'exécutent à l'intérieur d'une machine virtuelle, est-ce que quelque chose de similaire est disponible pour lxc / docker?
172
Réponses:
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 lorsque vous n'êtes pas dans un conteneur, ce sera/
pour toutes les hiérarchies. Lorsque vous êtes à l' intérieur d' 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.la source
docker
au lieu delxc
dans ces chemins/
pour tous les groupes de contrôle; sur mon système Debian 9 (systemd 232), seuls trois des dix groupes de contrôle (3:cpuset
,4:perf_event
et7:freezer
) sont à la racine; le reste est sous/init.scope
. Cela dit, je pense que la recherche de ce fichier:/docker/
est probablement l'heuristique la plus fiable pour le moment.grep 'docker\|lxc' /proc/1/cgroup
fonctionne pour moi sur Docker 18.09.Docker crée un
.dockerenv
fichier à la racine de l'arborescence de répertoires à l'intérieur du conteneur. Vous pouvez exécuter ce script pour vérifierPLUS: 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é appelé. Cela pourrait être utile. Je ne sais pas pour les autres distributions majeures cependant.la source
.dockerinit
fichier a été supprimé dans les versions récentes de Docker , donc cette méthode ne fonctionnera plus. Au moment d'écrire ces lignes, le.dockerenv
fichier est toujours conservé, donc peut-être qu'il pourrait être utilisé à la place./bin/running-in-container
est fourni parupstart
. Avec la transition vers systemd, il pourrait disparaître. J'espère que non - cela semble utile!.dockerenv
n'est pas recommandéeSur un nouveau système ubuntu 16.04, de nouveaux systemd et lxc 2.0
la source
Une manière concise de vérifier le docker dans un script bash est:
la source
Fonction Python pratique pour vérifier si elle fonctionne dans Docker:
la source
kubepods
je suppose.Nous utilisons le sched de proc (/ proc / $ PID / sched) pour extraire le PID du processus. Le PID du processus à l'intérieur du conteneur sera différent de celui de l'hôte (un système sans conteneur).
Par exemple, la sortie de / proc / 1 / sched sur un conteneur retournera:
Sur un hôte non-conteneur:
Cela permet de différencier si vous êtes dans un conteneur ou non.
la source
sh
et pasinit
là, mais il peut être presque n'importe quoi dans l'un ou l'autre.bash-5.0# cat /proc/1/sched bash (1, #threads: 1)
Le moyen le plus simple serait de vérifier l'environnement. Si vous avez la
container=lxc
variable, vous êtes dans un conteneur.Sinon, si vous êtes root, vous pouvez essayer d'exécuter
mknod
ou d'mount
opérer, si cela échoue, vous êtes probablement dans un conteneur avec des capacités supprimées.la source
/proc/1/cgroup
ne vous permet pas de le détecter.docker run alpine env
ne donne rien qui ressemble à cette variableMa réponse ne s'applique qu'aux processus Node.js, mais peut être pertinente pour certains visiteurs qui tombent sur cette question à la recherche d'une réponse spécifique à Node.js.
J'ai eu le même problème et en m'appuyant sur
/proc/self/cgroup
j'ai créé un package npm dans ce seul but - 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 actuellement pas testé dans Io.js mais peut tout aussi bien y fonctionner.
la source
Recherchez toutes les solutions ci-dessus en Python:
Preuve de concept:
la source
def is_non_docker(): return os.path.exists('/proc/1/cgroup')
selon la réponse acceptée ici stackoverflow.com/questions/20010199/…cat
! Nice one :-DDocker évolue de jour en jour, nous ne pouvons donc pas dire avec certitude s'ils vont continuer
.dockerenv .dockerinit
dans le futur.Dans la plupart des versions Linux,
init
c'est le premier processus à démarrer. Mais dans le cas des conteneurs, ce n'est pas vrai.la source
init
, ce qui n'est pas vrai sursystemd
oulaunchd
basé sur des systèmes ...init
), OpenRC, initng, runit. Regardez ici . La plupart des systèmes modernes basés sur Linux utiliseraientsystemd
, certains plus anciens, parvenus ... Tous les systèmes OS X modernes utiliseraientlaunchd
Ce Q&A SO: "Découvrez si le système d'exploitation fonctionne dans un environnement virtuel" ; bien que différent de la question du PO, il répond en effet aux cas courants de recherche dans quel conteneur 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 :
la source
virt-what
version 1.14-1 sur Ubuntu 16.04. Besoin d'un patch.J'ai traduit la réponse de JJC en rubis
la source
Dans un conteneur Docker, les entrées
/proc/self/cgroup
sont montées sur des groupes de contrôle sur l'hôte.par exemple dans un conteneur
alors que, pareil sur l'hôte
Utiliser quelque chose dans la coque pour un test discret
la source
Peut-être que cela fera l'affaire:
Est-ce que c'est ce que tu veux? J'espère que ça aide =)
la source
docker
binaire n'est disponible à l'intérieur du conteneur, évidemment.docker
et accède au socket docker des hôtes.