web-dev-qa-db-fra.com

Obtention de l'autorisation refusée lors d'une tentative de connexion au socket du démon Docker sous unix: ///var/run/docker.sock

Je suis nouveau au docker. Je viens d'essayer d'utiliser Docker sur ma machine locale (Ubuntu 16.04) avec Jenkins. 

J'ai configuré un nouveau travail avec un script de pipeline ci-dessous.

node {
    stage('Build') {
      docker.image('maven:3.3.3').inside {
        sh 'mvn --version'
      }
    }
}

Mais cela échoue avec l'erreur ci-dessous.

 enter image description here

42

L'utilisateur jenkins doit être ajouté au groupe docker:

Sudo usermod -a -G docker jenkins

Puis redémarrez Jenkins.

76
austingray

Mes premières solutions ont été:

usermod -aG docker jenkins
usermod -aG root jenkins
chmod 664 /var/run/docker.sock

Mais aucun d'eux ne fonctionne pour moi, j'ai essayé:

chmod 777 /var/run/docker.sock

Cela fonctionne, mais je ne sais pas si c'est le bon appel.

14
Kevin Garay

J'ai ajouté l'utilisateur jenkins au groupe racine et ai redémarré les jenkins et cela a commencé à fonctionner. 

Sudo usermod -a -G root jenkins
Sudo service jenkins restart
11

Succès pour moi

Sudo usermod -a -G docker $USER
reboot
5
shellhub

Jenkins tourne sous Docker et connecté Jenkins utilise le socket Docker de la machine hôte Ubuntu 16.04 via le volume vers /var/run/docker.sock.

Pour moi, la solution était:

1) Conteneur intérieur de Jenkins dans Docker (docker exec -it jenkins bash sur la machine hôte)

usermod -a -G docker jenkins
chmod 664 /var/run/docker.sock
service jenkins restart (or systemctl restart jenkins.service)
su jenkins

2) Sur la machine hôte:

Sudo service docker restart

664 signifie - lire et écrire (mais pas exécuter) pour le propriétaire et les utilisateurs du groupe.

5
heroin

Simplement == ajoutant docker en tant que groupe supplémentaire pour l'utilisateur jenkins

_Sudo usermod -a -G docker jenkins
_

n’est pas toujours suffisant lorsqu’on utilise une image Docker en tant que Agent Jenkins . Autrement dit, si votre Jenkinsfile commence par _pipeline{agent{dockerfile_ ou _pipeline{agent{image_:

_pipeline {
    agent {
        dockerfile {
            filename 'Dockerfile.jenkinsAgent'
        }
    }
    stages {

_

En effet, Jenkins exécute une commande docker run , ce qui entraîne trois problèmes.

  • Les programmes Docker ne seront probablement pas installés sur l’agent.
  • L'agent n'aura pas accès au socket du démon Docker et tentera donc d'exécuter Docker-in-Docker, ce qui correspond à non recommandé .
  • Jenkins donne l'ID utilisateur numérique et l'ID de groupe numérique que l'agent doit utiliser. L'agent n'aura aucun groupe supplémentaire, car _docker run_ ne se connecte pas au conteneur (il s'agit plutôt d'un Sudo).

Installation de Docker pour l'agent

Rendre les programmes Docker disponibles dans l’image Docker nécessite simplement d’exécuter les étapes étapes d’installation de Docker dans votre fichier Docker:

_# Dockerfile.jenkinsAgent
FROM debian:stretch-backports
# Install Docker in the image, which adds a docker group
RUN apt-get -y update && \
 apt-get -y install \
   apt-transport-https \
   ca-certificates \
   curl \
   gnupg \
   lsb-release \
   software-properties-common

RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN add-apt-repository \
   "deb [Arch=AMD64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"

RUN apt-get -y update && \
 apt-get -y install \
   docker-ce \
   docker-ce-cli \
   containerd.io

...
_

Partage du socket démon Docker

Comme a déjà été dit , résoudre le deuxième problème signifie exécuter le conteneur Jenkins Docker afin de partager le socket du démon Docker avec le démon Docker qui est à l'extérieur le conteneur. Vous devez donc dire à Jenkins d’exécuter le conteneur Docker avec ce partage, ainsi:

_pipeline {
    agent {
        dockerfile {
            filename 'Dockerfile.jenkinsAgent'
            args '-v /var/run/docker.sock:/var/run/docker.sock'
        }
    }

_

Définition des UID et des GID

La solution idéale au troisième problème serait de configurer des groupes supplémentaires pour l'agent. Cela ne semble pas possible. Le seul correctif que je connaisse est d'exécuter l'agent avec l'UID Jenkins et le GID Docker (le socket a l'autorisation d'écriture de groupe et appartient à _root.docker_). Mais en général, vous ne savez pas quels sont ces ID (ils ont été attribués lors de l'exécution de _useradd ... jenkins_ et _groupadd ... docker_ lors de l'installation de Jenkins et de Docker sur l'hôte). Et vous ne pouvez pas simplement dire Jenkins à l'utilisateur jenkins et au groupe docker

_args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'
_

car que indique à Docker d'utiliser l'utilisateur et le groupe nommés jenkins et docker dans l'image , et votre image Docker n'a probablement pas l'utilisateur et le groupe jenkins, et même si elle le faisait , il n'y aurait aucune garantie qu'il aurait le même UID et le même GID que l'hôte, et là De même, rien ne garantit que le docker GID est le même.

Heureusement, Jenkins exécute la commande _docker build_ pour votre fichier Docker dans un script. Vous pouvez donc utiliser la magie du script Shell pour transmettre ces informations sous forme d'arguments de génération Docker:

_pipeline {
    agent {
        dockerfile {
            filename 'Dockerfile.jenkinsAgent'
            additionalBuildArgs  '--build-arg JENKINSUID=`id -u jenkins` --build-arg JENKINSGID=`id -g jenkins` --build-arg DOCKERGID=`stat -c %g /var/run/docker.sock`'
            args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'
        }
    }
_

Qui utilise la commande id pour obtenir le UID et GID de l'utilisateur jenkins et le stat commande pour obtenir des informations sur le socket Docker.

Votre fichier Docker peut utiliser ces informations pour configurer un utilisateur jenkins et un groupe docker pour l'agent, à l'aide de groupadd , groupmod et useradd :

_# Dockerfile.jenkinsAgent
FROM debian:stretch-backports
ARG JENKINSUID
ARG JENKINSGID
ARG DOCKERGID
...
# Install Docker in the image, which adds a docker group
RUN apt-get -y update && \
 apt-get -y install \
   apt-transport-https \
   ca-certificates \
   curl \
   gnupg \
   lsb-release \
   software-properties-common

RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN add-apt-repository \
   "deb [Arch=AMD64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"

RUN apt-get -y update && \
 apt-get -y install \
   docker-ce \
   docker-ce-cli \
   containerd.io

...
# Setup users and groups
RUN groupadd -g ${JENKINSGID} jenkins
RUN groupmod -g ${DOCKERGID} docker
RUN useradd -c "Jenkins user" -g ${JENKINSGID} -G ${DOCKERGID} -M -N -u ${JENKINSUID} jenkins
_
3
Raedwald

2019-05-26

This a fonctionné pour moi!

Exemple docker-compose:

version: "3"
services:
  jenkins:
    image: jenkinsci/blueocean
    privileged: true
    ports:
      - "8080:8080"
    volumes:
      - $HOME/learning/jenkins/jenkins_home:/var/jenkins_home
    environment:
      - DOCKER_Host=tcp://socat:2375
    links:
      - socat

  socat:
     image: bpack/socat
     command: TCP4-LISTEN:2375,fork,reuseaddr UNIX-CONNECT:/var/run/docker.sock
     volumes:
        - /var/run/docker.sock:/var/run/docker.sock
     expose:
        - "2375"
2
pham cuong
Sudo usermod -a -G docker jenkins
Sudo service jenkins restart
1
Frank Hou

2019-02-16

La plupart des étapes étaient les mêmes pour moi que les autres l'ont écrit . Cependant, je n'ai pas pu ajouter de jenkins au groupe de docker en utilisant usermod avec les solutions mentionnées.

J'ai essayé la commande suivante depuis le hôte docker et le conteneur docker en cours d'exécution

Sudo usermod -a -G docker jenkins

(Je suis entré dans le conteneur docker en cours d'exécution} avec la commande suivante de l'hôte hôte docker

docker exec -t -i my_container_id_or_name /bin/bash

)

Reçu de hôte de menu fixe:

usermod: l'utilisateur 'jenkins' n'existe pas

Reçu de conteneur de menu fixe:

Nous espérons que vous avez reçu la conférence habituelle du système local Administrateur. Cela se résume généralement à ces trois choses:

#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.

[Sudo] mot de passe pour Jenkins:

Je ne connaissais pas le mot de passe.

Sans la partie Sudo de la commande, dans le conteneur docker j'ai reçu:

usermod: permission refusée. usermod: ne peut pas verrouiller/etc/passwd; essayer encore plus tard.

Solution: Je suis entré dans le conteneur docker en cours d'exécution à partir du hôte docker avec la commande suivante:

docker exec -t -i -u root my_container_id_or_name /bin/bash

Maintenant, je suis entré en tant que root , et j'ai lancé la commande suivante:

usermod -a -G docker jenkins

Ensuite, à partir de hôte de menu fixe, j'ai redémarré mon conteneur de menu fixe en cours d'exécution avec la commande suivante:

docker restart my_container_id_or_name

Après cela, j’ai commencé le travail de Jenkins et c’est fini avec succès.

J'ai seulement utilisé le root user pour émettre la commande usermod pour l'utilisateur jenkins.

0
Z3d4s

Découvrez cette image de docker que j'ai créée pour utiliser Jenkins avec docker . https://hub.docker.com/r/fristonio/jenkins_docker/

Lisez les instructions sur l'utilisation. Aussi, vous pouvez jeter un oeil au fichier Dockerfile ici

0
Deepesh Pathak

Sur le serveur où Jenkins est en cours d'exécution, j'ai utilisé

Sudo setfacl -m user:Tomcat:rw /var/run/docker.sock

Et puis exécutez chaque conteneur de docker avec

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

Utiliser setfacl semble être une meilleure option, et aucun "utilisateur -u" n'est nécessaire. Les conteneurs s'exécutent alors sous le même utilisateur que Jenkins. Mais j'apprécierais tout retour des experts en sécurité.

0
java4africa

Dans mon cas, il était non seulement nécessaire d'ajouter l'utilisateur jenkins au groupe docker, mais également de faire de ce groupe le groupe principal de l'utilisateur jenkins.

# usermod -g docker jenkins
# usermod -a -G jenkins jenkins

N'oubliez pas de reconnecter le nœud esclave jenkins ou de redémarrer le serveur jenkins, selon votre cas. 

0
Camilo Silva