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).
0 votes
@c4f4t0r - En utilisant ftrace, les sources du noyau et une réflexion créative, j'ai trouvé le problème. serverfault.com/a/897476/71430
0 votes
Ça ne vous aidera pas, mais je suis vraiment surpris que ce ne soit pas une norme
mount
car cela me semble être une exigence assez courante. J'en ai besoin :) ... J'exécute un seul binaire et j'inclus toutes ses bibliothèques, donc il n'y a pas besoin d'un base-O/S dans le conteneur - donc je n'en ai pas, mais il semble vouloir/proc
pour certaines fonctionnalités. La même chose se produirait avec des binaires statiques, tels queGo
ceux - ils pourraient être installés sans base-O/S dans un conteneur. J'ai essayé-v /proc:/proc
et ça n'aide pas pour la raison que vous donnez.