2 votes

Comment trouver l'utilisateur qui accède à /var/run/docker.sock et qui provoque l'erreur "permission denied" ?

Cette question est différente des questions suivantes :

Docker : Permission refusée lors de la tentative de connexion au socket du démon Docker à unix:///var/run/docker.sock. Parce qu'ils n'ont pas considéré que jenkins devait être installé comme un conteneur docker, ici je n'ai pas d'utilisateur jenkins pour donner à cet utilisateur l'accès à ce fichier.

Et aussi de celui-ci docker.sock permission denied Parce que je ne sais pas pour quel utilisateur j'ai eu cette erreur, Voici l'utilisateur root a accès à ce fichier mais l'erreur s'est reproduite.

Voici mon problème :

Je veux lancer Docker jenkinsci/blueocean en utilisant la commande suivante sur ubuntu :

docker container run \
  --name jenkins-blueocean \
  --rm \
  --detach \
  --publish 8181:8080 \
  --publish 50000:50000 \
  --volume jenkins-data:/var/jenkins_home \
  --volume jenkins-docker-certs:/certs/client:ro \
  --volume /var/run/docker.sock:/var/run/docker.sock \
  jenkinsci/blueocean

Après avoir exécuté jenkins sur le conteneur dokcer, lorsque j'utilise l'agent comme suit :

agent {
        docker {
            image 'maven:3-alpine'
        }
}

J'ai obtenu l'erreur suivante :

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.39/images/create?fromImage=maven&tag=3-alpine: dial unix /var/run/docker.sock: connect: permission denied

Ici, lorsque j'utilise cette commande, cela résout le problème :

chmod 777 /var/run/docker.sock

Mais je ne veux pas permettre à tous les utilisateurs d'accéder à cette prise en raison de failles de sécurité.

Je devrais également dire que l'utilisateur actuel est Root et qu'il a accès à /var/run/docker.sock

Voici quelques informations utiles :

echo $USER
root

ls -ls /var/run/docker.sock
srw-rw---- 1 root docker 0 Jul 24 14:56 /var/run/docker.sock

groups
root docker

Quel utilisateur dois-je autoriser l'accès à ce fichier ? jenkins est exécuté sur un conteneur et il n'y a pas d'utilisateur jenkins sur mon système, comment puis-je savoir quel utilisateur essaie d'accéder à ce fichier socket ? /var/run/docker.sock et par conséquent j'ai eu cette erreur ?

3voto

Keegan Points 210

Si vous regardez le Dockerfile pour jenkinsci/blueocean, par exemple, 1.23.2 . Vous pouvez voir que l'utilisateur "jenkins" est uid 1000 et gid 1000. Ce sont ces identifiants qui doivent correspondre pour l'accès au volume, et non le nom d'utilisateur.

Plutôt que d'accorder un accès uid/gid 1000 à /var/run/docker.sock sur l'hôte, il serait peut-être préférable d'exécuter le conteneur en tant qu'utilisateur/groupe ayant la permission. Vous pouvez vérifier cela avec id -u root y id -g docker puis utilisez-le avec votre docker run par exemple (en supposant que l'uid de Root est 0), docker run -u 0 ... . Voir le page doc pour d'autres exemples d'utilisation -u / --user . Si vous vous exécutez sous le même uid que Root dans le conteneur, vous n'aurez probablement pas de problème, mais s'il s'agit d'un uid différent, vous risquez de rencontrer des problèmes car d'autres uids pourraient manquer de la configuration nécessaire pour pouvoir exécuter correctement le matériel Jenkins.

Si vous vraiment Si vous souhaitez modifier le fichier /var/run/docker.sock, la solution serait de créer un groupe avec le gid 1000 et d'ajouter Root à ce groupe.

0voto

Neo Anderson Points 4184

Selon le Jenkins télécharger-et-exécuter-jenkins-docker documentation :

4. Afin d'exécuter des commandes Docker à l'intérieur des nœuds Jenkins, téléchargez et exécutez la commande docker:dind

Docker dans Docker (dind) permet d'exécuter le moteur Docker en tant que conteneur à l'intérieur de Docker - ce qui est le genre d'intuition à faire.

Je viens de reproduire et cela a bien fonctionné pour moi avec ces commandes (j'ai aussi inclus --privileged dans les options de lancement. Je ne sais pas si c'est obligatoire) :

docker container prune -f;
docker container run   --name jenkins-docker     --detach   --privileged   --network jenkins   --network-alias docker   --env DOCKER_TLS_CERTDIR=/certs   --volume jenkins-docker-certs:/certs/client   --volume jenkins-data:/var/jenkins_home   --publish 2376:2376   docker:dind;
docker container run   --name jenkins-blueocean   --rm   --detach  --privileged   --network jenkins   --env DOCKER_HOST=tcp://docker:2376   --env DOCKER_CERT_PATH=/certs/client   --env DOCKER_TLS_VERIFY=1   --publish 8080:8080   --publish 50000:50000   --volume jenkins-data:/var/jenkins_home   --volume jenkins-docker-certs:/certs/client:ro   jenkinsci/blueocean

Cependant tout en haut de la page repo dind README.md vous pouvez trouver la déclaration suivante qui déconseille fortement la configuration décrite ci-dessus (merci à @David Maze pour l'avoir signalé) :

Si vous êtes venu ici parce que vous souhaitez exécuter un système de test comme Jenkins dans un conteneur, et que vous voulez que ce conteneur puisse faire tourner d'autres conteneurs, lisez ceci. article de blog premier. Merci.

Je l'utilise personnellement dans mon propre terrain de jeu à la maison, où je fais souvent tout essuyer de toute façon, à mes propres risques.

0voto

V. Silverman Points 11

Ce référentiel peut contenir la solution à votre problème, je l'avais essayé récemment et cela fonctionne bien. Gardez cependant à l'esprit que jenkinsci/blueocean est périmée et est actuellement dépréciée par Jenkins.

Si vous préférez utiliser le système officiel jenkins/jenkins en utilisant la communication docker.sock - vous pouvez trouver des solutions en postant votre question à Canal de packaging et de plugins Docker de Jenkins

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X