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 ?

Était-ce utile?

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 NPM pour que cela soit uniquement à cet effet - de détecter si un processus nœud.js fonctionne à l'intérieur d'un conteneur Docker ou non.

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top