9 votes

Comment monter un /proc privé dans un espace de nom à l'intérieur d'un conteneur docker ?

J'ai besoin de créer des espaces de noms à l'intérieur d'un conteneur Docker. Et dans le cadre de cette opération, je devrai monter un conteneur /proc privé à l'espace de nom interne. Je réalise que je devrai exécuter le conteneur avec certains privilèges pour que cela se produise, mais je préférerais activer l'ensemble le plus minimal.

Ça marche :

$ sudo docker run --privileged --security-opt=seccomp=unconfined \
 -it fedora:rawhide /usr/bin/unshare -Ufmp -r \
 /bin/sh -c 'mount -t proc proc /proc'

Ce n'est pas le cas :

$ sudo docker run --cap-add=sys_admin --security-opt=seccomp=unconfined \
  -it fedora:rawhide /usr/bin/unshare -Ufmp -r \
   /bin/sh -c 'mount -t proc proc /proc'
mount: /proc: cannot mount proc read-only.

Donc, juste en désactivant les filtres seccomp et en ajoutant CAP_SYS_ADMIN n'est pas suffisant. Ce que est assez ?

Mise à jour : Selinux est une partie du problème. Si vous désactivez l'application de Selinux de manière globale, cela fonctionne. Mais, vous pouvez également désactiver l'application pour un conteneur particulier avec --security-opt label:disable et cela est documenté dans le section de configuration de la sécurité du manuel en ligne de Docker :

sudo docker run --cap-add=sys_admin --security-opt label:disable \
 -it fedora:rawhide /usr/bin/unshare -fmp /bin/sh -c \
 'mount --make-private / ; mount -t proc proc /proc'

Mais cela échoue si le -U y -r sont ajoutés à unshare . Et, bien sûr, en ajoutant --privileged à la commande d'exécution de docker fonctionne très bien même avec l'option -U y -r drapeaux.

J'essaie actuellement d'utiliser le traçage du noyau pour comprendre ce qui, exactement, me donne un EPERM. C'est une erreur très peu spécifique et peu utile.

0 votes

SamYaple sur le canal #docker sur Freenode a été très utile ici, et il se peut que ce soit un problème de cgroups. Il semble y avoir un cgroup 'devices'.

0 votes

Avez-vous essayé d'utiliser -v /proc:/proc ?

0 votes

@c4f4t0r - Eh bien, cela ne ferait pas ce que je veux. Je ne veux pas le /proc de l'espace de noms dans lequel docker s'exécute (vraisemblablement l'espace de noms de niveau racine).

5voto

Tom Points 674

Cette commande fonctionne :

sudo docker run --cap-add=sys_admin --security-opt label:disable -it fedora:rawhide /bin/sh -c 'for dir in $(awk '"'"'/\/proc\// { print $5; }'"'"' /proc/1/mountinfo ); do umount "$dir"; done; /usr/bin/unshare -Ufmp -r /bin/sh -c '"'"'mount --make-private / ; mount -t proc proc /proc ; ls /proc'"'"

Je ne l'ai pas réparti sur plusieurs lignes car la citation est vraiment importante. En gros, ça démonte tout un tas de trucs dans le dossier /proc avant de lancer unshare et de monter /proc dans l'espace de nom de l'utilisateur enfant.

Docker monte sur un tas de répertoires et de fichiers dans /proc avec ses propres répertoires qui sont des répertoires tmpfs vides et des fichiers nuls. Divers fichiers dans /proc représentent des valeurs qui sont applicables à l'ensemble du système. En effet, /proc/kcore vous permettrait de lire la mémoire du noyau à l'intérieur du conteneur si vous êtes root, ce qui, étant donné que beaucoup de gens veulent croire que les conteneurs sont une sorte de VM légère ou autre, en surprendrait plus d'un.

Le noyau dans (à partir de la version 4.14 en tout cas) fs/namespace.c:mnt_already_visible vérifie si vous montez un système de fichiers déjà monté, et si ce système de fichiers a des choses montées comme systèmes de fichiers enfants et que ces montages ont le drapeau MNT_LOCKED, il échoue. Le drapeau MNT_LOCKED semble être appliqué (je n'ai pas cherché où il se trouve dans le noyau) à tous les montages lorsque vous créez un espace de nom d'utilisateur afin de vous empêcher de démonter les choses dans cet espace de nom (parce que vous obtenez des privilèges 'dans' l'espace de nom d'utilisateur) et de rendre visible à nouveau les choses cachées.

La commande que j'ai postée utilise un awk script sur le contenu de /proc/1/mountinfo pour extraire tous les sous-répertoires et fichiers dans /proc que Docker a monté dessus, et les démonte tous. Cela rend le /proc Le système de fichiers est à nouveau montable dans des espaces de noms d'utilisateurs imbriqués.

0 votes

Cela ne fonctionne pas. Ne gaspillez pas le temps des gens avec ces réponses.

4 votes

@LtWorf - Ce n'est pas un commentaire utile. Cette commande a fonctionné pour moi. Il est possible que Docker ait changé sa façon de faire depuis que j'ai écrit ceci et que cela ne fonctionne plus. Il est également possible que j'aie manqué une information cruciale nécessaire à son bon fonctionnement. Mais je n'ai pas publié de " réponse inutile ", car j'ai indiqué ce que j'ai fait pour résoudre mon problème. Si vous voulez être utile, dites pourquoi cela n'a pas fonctionné pour vous.

2 votes

En parlant d'informations périmées, Worf est un lieutenant commandant, aux dernières nouvelles. :)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X