Comment vérifier si un processus est en cours d'exécution à l'intérieur de conteneurs docker
[Updated1] j'ai une coque qui va changer TCP paramètres du noyau dans certaines fonctions, mais maintenant j'ai besoin de faire cette coque exécuter dans le menu fixe conteneur, ce qui signifie que la coque devez savoir qu'il est en cours d'exécution à l'intérieur d'un conteneur et d'arrêt de la configuration du noyau.
Maintenant, je ne suis pas sûr de savoir comment y parvenir, voici le contenu de /proc/self/cgroup
à l'intérieur du conteneur:
9:hugetlb:/
8:perf_event:/
7:blkio:/
6:freezer:/
5:devices:/
4:memory:/
3:cpuacct:/
2:cpu:/docker/25ef774c390558ad8c4e9a8590b6a1956231aae404d6a7aba4dde320ff569b8b
1:cpuset:/
Tous les indicateurs ci-dessus, puis-je savoir si ce processus est en cours d'exécution à l'intérieur d'un conteneur?
[Updated2]: j'ai aussi remarqué Déterminer si un processus s'exécute à l'intérieur d'un conteneur lxc/Docker, mais il ne semble pas travailler dans ce cas, le contenu /proc/1/cgroup
de mon conteneur:
8:perf_event:/
7:blkio:/
6:freezer:/
5:devices:/
4:memory:/
3:cpuacct:/
2:cpu:/docker/25ef774c390558ad8c4e9a8590b6a1956231aae404d6a7aba4dde320ff569b8b
1:cpuset:/
N /lxc/containerid
- Pas très clairement la question. Pourquoi avez-vous besoin de cela?
- Double de stackoverflow.com/questions/20010199/...
- n /lxc/<containerid> dans mon cas, voir mise à jour
- les paramètres du noyau est en lecture seule dans le conteneur Docker,donc j'ai besoin de savoir si ma coquille est en cours d'exécution à l'intérieur de conteneurs et de désactiver les fonctions du noyau dans ma coquille. voir mise à jour.
- Certaines étapes dans le script d'essayer de modifier les paramètres du noyau, et doivent être ignorés lors de l'exécution dans le Panneau. Clair.
Vous devez vous connecter pour publier un commentaire.
À vérifier à l'intérieur d'un conteneur Docker si vous êtes à l'intérieur d'un conteneur Docker ou ne peut être fait via
/proc/1/cgroup
. Comme ce post suggère que vous puissiez les suivantes:À l'extérieur d'un conteneur docker toutes les entrées dans
/proc/1/cgroup
fin sur/
comme vous pouvez le voir ici:À l'intérieur d'un conteneur Docker certains groupes de contrôle appartiennent à Docker (ou LXC):
12:perf_event:/ 11:blkio:/init.scope 10:cpuset:/ 9:devices:/init.scope 8:hugetlb:/ 7:cpu,cpuacct:/init.scope 6:net_cls,net_prio:/ 5:memory:/init.scope 4:pids:/init.scope 3:rdma:/ 2:freezer:/ 1:name=systemd:/init.scope
Docker crée
.dockerenv
et(retiré dans v1.11) des fichiers à la partie supérieure du conteneur de l'arborescence de répertoires de sorte que vous pourriez vouloir vérifier si ceux-ci existent..dockerinit
Quelque chose comme cela devrait fonctionner.
/.dockerinit
sur votre ordinateur hôte (peut-être par accident), auquel cas il sera mal à l'extérieur d'un conteneur..dockerinit
a été supprimé dans les versions plus récentes de Docker./.dockerenv
là./.dockerenv
dans le long terme. C'est pas destiné à être utilisé de cette façon.Nous utilisons le proc sched (/proc/$PID/sched) pour extraire le PID du processus. Le processus de PID à l'intérieur du conteneur seront différents, alors il PID sur l'hôte (un non-système de conteneurs).
Par exemple, la sortie de /proc/1/sched sur un conteneur
sera de retour:
Tout sur un non-conteneur de l'hôte:
Ce qui permet de le différencier si vous êtes dans un conteneur ou pas. par exemple, vous pouvez faire:
head -n1 /proc/1/sched
retournedumb-init (1, #threads: 1)
, de sorte que le chèque est suggéré dans cette réponse échoue. (Aussi, contrairement à ce que la réponse indique, le PID est indiqué comme "1" dans la ligne même si je suis en train de faire ceci dans un récipient.)Thomas solution que code:
Note
La
read
avec une variable muette est un simple langage pour cela produit une sortie?. C'est une méthode compact pour le tournage d'une verbosegrep
ouawk
dans un test d'un motif.Note complémentaire sur lire
3:cpu,cpuacct:/system.slice/docker-1ce79a0dec4a2084d54acf187a1e177e0339dc90d0218b48b4456576ecaf291e.scope
ne correspondent pas. Plus simple àgrep -q docker /proc/1/cgroup
; le code de résultat de qui doit également être suffisant.read
pourraient travailler pourbash
, mais dans le plus utilisédash
shell, vous devez utiliser soitread dummy
(ou similaire), ou utiliser une construction comme[ -n "$(command)" ]
read
sans nom de la variable. Ce n'est vrai que pour bash et ksh93. Le Opengroup ne spécifieread var
, et ne mentionne pasread
comportement sans au moins une variable. Dans bash et ksh93, si aucun var est donné, lire utilise la variable d'environnementREPLY
.awk -F: '$3 ~ /docker/' /proc/self/cgroup | read
? Fonctionne pour moi.Nous devions exclure les processus en cours d'exécution dans des conteneurs, mais au lieu de vérifier juste docker cgroups nous avons décidé de comparer
/proc/<pid>/ns/pid
à l'initialisation du système à/proc/1/ns/pid
. Exemple:Ou dans notre cas, nous voulions une chemise qui génère une erreur si le processus n'est PAS dans un contenant
qui, nous pouvons l'exécuter à partir d'un autre processus, et si le code de sortie est à zéro, alors le PID spécifié est en cours d'exécution dans un autre espace de noms.
readlink /proc/self/ns/pid
etreadlink /proc/1/ns/pid
produire le même résultat.Ce qui fonctionne pour moi est de vérifier le numéro d'inœud de '/.'
À l'intérieur du panneau, c'est un nombre très élevé.
À l'extérieur du panneau, son très faible nombre comme '2'.
Je pense que cette approche pourrait également dépendre sur le système de fichiers utilisé.
Exemple
À l'intérieur du panneau:
À l'extérieur de l'docker
Dans un script:
J'ai créé un petit script python. J'espère que quelqu'un le trouve utile. 🙂