J'utilise chromedriver + chrome dans Docker dans mon environnement de test.
Tout fonctionnait bien jusqu'à la dernière mise à niveau de CoreOS.
Ce sont les versions qui semblent fonctionner:
VERSION=1185.5.0
VERSION_ID=1185.5.0
BUILD_ID=2016-12-07-0937
Et c'est une version plus récente qui provoque le vidage du chrome:
VERSION=1235.4.0
VERSION_ID=1235.4.0
BUILD_ID=2017-01-04-0450
En regardant les changements, il semble que docker ait été mis à niveau de 1.11.x à 1.12.x, ce qui a interrompu l' setns()
appel à l'intérieur du conteneur. setns()
est utilisé par Chrome pour créer des espaces de noms.
Voici les exemples de sorties:
jsosic-coreos-test-20161207 ~ # docker --version
Docker version 1.11.2, build bac3bae
De l'intérieur d'un conteneur sur cette boîte:
[root@2939f21ecfaa /]# /opt/google/chrome/google-chrome
[57:57:0107/015130:ERROR:browser_main_loop.cc(261)] Gtk: cannot open display:
C'est ainsi que la nouvelle version l'a cassé:
jsosic-coreos-test-2017-01-04 ~ # docker --version
Docker version 1.12.3, build 34a2ead
[root@13ab34c36c82 /]# /opt/google/chrome/chrome
Failed to move to new namespace: PID namespaces supported,
Network namespace supported,
but failed: errno = Operation not permitted
Aborted (core dumped)
Ce que j'ai découvert, c'est que si je démarre le conteneur avec --cap-add=SYS_ADMIN
ou --privileged
- Chrome fonctionne comme prévu.
Quelle est la différence entre ces deux commutateurs? Quelles fonctionnalités sont activées par --privileged
?
Et puis-je autoriser l' setns()
intérieur du conteneur sans compromettre la sécurité?
la source
Réponses:
AFAICS, la documentation suggère d' accorder les capacités nécessaires à un conteneur, plutôt que d'utiliser le
--privileged
commutateur. L'exécution en mode privilégié semble accorder au conteneur toutes les capacités (exactement celles qui sont répertoriées dans la première URL, à condition que les documents soient à jour).En bref, je dirais que cela
--cap-add=SYS_ADMIN
accorde un plus petit sous-ensemble de capacités au conteneur, par rapport au--privileged
commutateur. Évidemment, les exemples de la documentation Docker (première URL) semblent préférer simplement ajouter la capacitéSYS_ADMIN
ouNET_ADMIN
si nécessaire.la source
exec_linux.go
aidé. J'ai essayé de cloner le dépôt Docker pour le parcourir, mais comme cela m'a pris quelques heures, je l'ai juste oublié :)Une différence est que --privileged monte / dev et / sys en RW, alors que SYS_ADMIN les monte en RO. Cela signifie qu'un conteneur privilégié a un accès complet aux périphériques du système. SYS_ADMIN ne vous donne pas cela.
la source