2015-03-16 3 views
3

Je lance un conteneur qui exécute un script bash qui fait un docker construit en interne à l'aide du docker 1.3.2 sur Centos 7.0.1406. Les fichiers/commandes sont à https://gist.github.com/wrabbit-revisited/1d70d0f1805be1848c08./var/run/docker.sock inaccessible dans un conteneur fonctionnant sur centos 7

La construction docker a besoin d'accéder à la prise de docker donc j'utiliser une astuce commune, comme par http://nathanleclaire.com/blog/2014/07/12/10-docker-tips-and-tricks-that-will-make-you-sing-a-whale-song-of-joy/:

-v /var/run/docker.sock:/var/run/docker.sock 

Avant la construction i exécuter une vérification dans le script:

if [ -e "/var/run/docker.sock" ]; 
then 
    echo "docker.sock found" 
else 
    echo "docker.sock not found" 
fi 

et le "echo" montre que docker.sock est introuvable. Il est trouvé si la vérification est effectuée à l'extérieur du conteneur en utilisant sudo.

J'ai essayé d'ajouter "--permissive = true" à la ligne de commande "docker run", mais pas de changement apparent.

Il y a une référence à un problème similaire ici: https://github.com/dpw/selinux-dockersock. Il cible Fedora/RHEL, mais ne résout pas ce problème non plus. Si j'utilise "setenforce Permissive" et sestatus pour s'assurer que selinux est en mode permissif, le problème reste non résolu.

J'ai également essayé d'ajouter "--security-opt = label: type: docker_t" à la ligne de commande docker, comme https://github.com/jwilder/nginx-proxy/issues/40. Pas d'effet apparent.

La stratégie selinux pour Docker est décrite ici: http://www.unix.com/man-page/centos/8/docker_selinux/. Beaucoup d'informations, mais je ne suis pas sûr si selinux contribue au problème. Si je modifie/etc/selinux/config pour désactiver selinux puis redémarrer et exécuter sestatus, il dit que selinux est désactivé, mais le problème persiste.

En regardant à propos de, il peut être lié à ceci: https://github.com/docker/compose/issues/983. Utiliser cette astuce pour lancer docker à l'intérieur d'un conteneur est assez courant, mais il existe peut-être une meilleure façon de le faire ou une bonne solution de contournement. Je pensais à dind, mais c'est un travail et c'est une approche très répandue et simple (en surface) pour exécuter une construction docker à l'intérieur d'un conteneur. Il y a probablement une solution simple.

Toute aide serait appréciée! merci

+0

Je viens de l'essayer sur un bureau ubuntu 14.04 avec docker 1.2.0. Le fichier build.sh qui s'exécute dans le conteneur a pu trouver /var/run/docker.sock donc ce problème semble être propre à Centos 7. BTW, il est nécessaire de rendre exécutable build.sh avant de construire l'image du docker. –

+0

Nous avons réussi à faire fonctionner DockerUI sur RHEL/CentOS en utilisant le drapeau '--privileged'. C'est un peu un marteau et je serais heureux d'apprendre une meilleure approche. –

+0

Yep .. actuellement Docker est un peu une cible en mouvement, en particulier pour la sécurité. Pas un bloqueur pour moi actuellement - je suis passé à Ubuntu 14.04 pour éviter le problème. –

Répondre

6

Je pense que votre problème peut être dû à un malentendu de l'option -v à docker run. Vous dites que vous avez fait

-v /var/run/docker:/var/run/docker 

Cela crée une liaison de montage dans le conteneur pour le fichier ou le répertoire /var/run/docker. Mais dans votre cas, il n'y a pas de fichier ou de répertoire. Vous voulez le fichier /var/run/docker.sock. Donc, vous devez faire

-v /var/run/docker.sock:/var/run/docker.sock 

de lier ce fichier dans le conteneur.

Comme /var/run/docker n'existait pas, vous pourriez vous demander pourquoi docker ne vous a pas parlé de l'erreur. Mais l'option -v a le comportement surprenant que si le chemin n'existe pas sur l'hôte, docker le créera en tant que répertoire. Donc, vous vous retrouvez avec un /var/run/docker répertoire vide inutile sur l'hôte et le conteneur.

En principe, vous pouvez aussi faire -v /var/run:/var/run pour lier le répertoire conteneur.Mais c'est probablement une mauvaise idée de donner un accès conteneur à l'arborescence /var/run de l'hôte. Et comme vous êtes sur CentOS, vous devrez également utiliser https://github.com/dpw/selinux-dockersock pour accéder à /var/run/docker.sock afin de travailler avec SELinux en mode forcé.

+0

Merci pour votre contribution, David. La question a une faute de frappe - l'essentiel a la ligne de commande réelle et il utilise docker.sock. –

+2

Merci @David selinux-dockersock était indispensable! –

2

Confirmé l'installation https://github.com/dpw/selinux-dockersock est suffisant et bon à long terme.

Une solution alternative rapide consiste à passer l'argument --privileged lors du démarrage d'un conteneur.