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

177

Je suis nouveau dans docker. J'ai juste essayé d'utiliser docker sur ma machine locale (Ubuntu 16.04) avec Jenkins.

J'ai configuré un nouveau travail avec le 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.

entrez la description de l'image ici

Ponsuyambu Velladurai
la source
1
est-ce un Jenkins monolithique ou a une configuration maître-esclave? Vérifiez avec quel utilisateur vous exécutez la commande docker inspect. Voir si /var/run/docker.sock a un accès RW au groupe.
Ram Kamath
2
étapes de post-installation de docker: docs.docker.com/install/linux/linux-postinstall/…
radistao

Réponses:

297

L'utilisateur jenkinsdoit être ajouté au groupe docker:

sudo usermod -a -G docker jenkins

Puis redémarrez Jenkins.

Éditer

Si vous arrivez à cette question de débordement de pile parce que vous recevez ce message de docker, mais que vous n'utilisez pas jenkins, l'erreur est très probablement la même: votre utilisateur non privilégié n'appartient pas au groupe docker.

Tu peux faire:

sudo usermod -a -G docker alice

ou quel que soit votre nom d'utilisateur.

Vous pouvez le vérifier à la fin en faisant grep docker /etc/groupet voir quelque chose comme ceci:

docker:x:998:alice

dans l'une des lignes.

Modifiez ensuite votre ID de groupe d'utilisateurs en docker:

newgrp docker
austingray
la source
90
et relogin user
Ilya Kolesnikov
8
Bonne réponse, mais pour être plus général, nous pourrions faire ceci: sudo usermod -a -G docker $USERet déconnecter ou redémarrer. lien
Julien Nyambal
10
J'ai dû redémarrer mon serveur pour que cela fonctionne.
etagwerker
3
J'ai dû déconnecter / reconnecter mes nœuds pour que cela fonctionne (ils sont connectés via ssh)
GaspardP
29
Pas besoin de vous reconnecter, utilisez simplement à la newgrp dockerplace dans la même session de terminal.
C14L
69

Mes premières solutions ont été:

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

Mais aucun d'entre 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 choix.

Kevin Garay
la source
4
La raison pour laquelle il a échoué est probablement parce que vous avez dû rouvrir le terminal. Cela a échoué après avoir fait 664, mais j'ai ensuite ouvert un nouveau shell, cela a fonctionné.
PHGamer
1
J'ai essayé de rouvrir, mais cela n'a commencé à fonctionner qu'après le dernier chmod 777
ironique
le problème était qu'après le redémarrage, 777 était réinitialisé à 660. Ce qui a résolu le problème pour moi était «usermod -aG users jenkins».
ironique
Je me rends compte qu'il a été réinitialisé, mais ne définissez pas les autorisations docker.sock sur 777. Cela donne à quiconque la racine sur votre système. Ils peuvent parler à docker et créer des conteneurs privilégiés sans aucune restriction.
Lance Hudson
3
Malgré cela a fonctionné pour l'auteur et même pour moi, donner plus d'accès au docker.sockfichier n'est pas la meilleure solution, il vous suffit d'exécuter les usermodinstructions ..., puis de redémarrer votre système, sinon cela ne prend pas effet
Mariano Ruiz
32

Succès pour moi

sudo usermod -a -G docker $USER
reboot
shellhub
la source
5
pas besoin de redémarrer. Déconnectez-vous, puis reconnectez-vous. Je parle usermod
Abdennour TOUMI
1
Sur Ubuntu 18.04, j'ai dû redémarrer pour que le paramètre fonctionne.
Nikhil
1
Sur Ubuntu 20.04, j'avais besoin du redémarrage. Fermer la session ne suffit pas.
framontb
Ou exécutez su $ {USER} au lieu de vous déconnecter
goonerify
19

2018-08-19

Je suis coincé depuis des jours sur celui-ci et comme je n'ai pas trouvé de réponse complète avec le pourquoi et le comment, je vais en publier une pour d'autres personnes qui trébuchent sur le même problème et les réponses d'en haut ne fonctionnent pas.

Voici les 3 étapes cruciales lors de l'exécution de Jenkins à l'intérieur de docker:

  1. Vous montez la prise /var/run/docker.sock sur le conteneur jenkins afin de pouvoir utiliser le docker de l'hôte.
  2. Vous devez installer docker à l'intérieur du conteneur pour pouvoir l'utiliser. Ceci est un excellent article simple sur la façon de procéder. Notez que les versions plus récentes peuvent déjà avoir docker installé
  3. Vous exécutez sudo usermod -a -G docker jenkinspour ajouter jenkins au groupe docker. Cependant, ici, vous pouvez rencontrer un problème d'autorisation si le docker hôte et le docker du conteneur n'ont pas le même identifiant de groupe, il est donc très important d'ajuster le gid du docker du conteneur pour qu'il soit le même que le gid du docker hôte

Vous pouvez le faire dans le cadre d'un script de lancement ou simplement en l'utilisant execet en le faisant manuellement:groupmod -g <YOUR_HOST_DOCKER_GID> docker .

De plus, ne modifiez pas les autorisations du /var/run/docker.sockà 777 ou des trucs comme ça, car c'est un gros risque pour la sécurité, vous donnez fondamentalement à tout le monde permission d'utiliser docker sur votre machine.

J'espère que cela t'aides

Urosh T.
la source
1
Merci - notez que pour les images Jenkins Docker actuelles, les commandes docker sont déjà installées (et apt-get ne l'est pas.) Vos autres points - ajouter Jenkins au bon groupe et s'assurer que le GID correspond à celui de l'hôte Docker, restent sur place.
Steve Bonds
1
J'ai sauvé ma vie avec le problème d'identifiant de groupe. Merci!
lenkovi
13

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

sudo usermod -a -G root jenkins
sudo service jenkins restart
Ponsuyambu Velladurai
la source
16
C'est une mauvaise pratique de sécurité. L'approche préférée est cette réponse .
kevindaub
11

Modifier l'autorisation d'accès du fichier docker.sock

chmod 777 /var/run/docker.sock

ou vous pouvez utiliser sudoau début de la commande.

chmod 777autorisera toutes les actions pour tous les utilisateurs tandis que chmod 666permettra à tous les utilisateurs de lire et d'écrire mais ne pourra pas exécuter le fichier.

USMAN FAZIL
la source
C'est ce dont j'avais besoin, merci!
crazynx
9

Ajout simplementdocker comme groupe supplémentaire pour l' jenkinsutilisateur

sudo usermod -a -G docker jenkins

n'est pas toujours suffisant lors de l'utilisation d'une image Docker comme agent Jenkins . Autrement dit, si vous Jenkinsfilecommencez par pipeline{agent{dockerfileou pipeline{agent{image:

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

C'est parce que Jenkins exécute une docker runcommande, ce qui entraîne trois problèmes.

  • L'agent n'aura (probablement) pas les programmes Docker installés.
  • L'agent n'aura pas accès au socket du démon Docker et essaiera donc d'exécuter Docker-in-Docker, ce qui n'est pas recommandé .
  • Jenkins donne l'ID utilisateur numérique et l'ID de groupe numérique que l'agent doit utiliser. L'agent n'aura pas de groupes supplémentaires, car il docker runne se connecte pas au conteneur (c'est plus comme a sudo).

Installation de Docker pour l'agent

Pour rendre les programmes Docker disponibles dans l'image Docker, il suffit d'exécuter les étapes d'installation de Docker dans votre Dockerfile:

# 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 du démon Docker

Comme cela a été dit précédemment , résoudre le deuxième problème signifie exécuter le conteneur Jenkins Docker afin qu'il partage le socket du démon Docker avec le démon Docker qui se trouve à l' extérieur du 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 dont j'ai connaissance 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é alloués lorsque useradd ... jenkinset groupadd ... dockerexécutés lorsque Jenkins et Docker ont été installés sur l'hôte). Et vous ne pouvez pas simplement dire Jenkins à l'utilisateur jenkinset au groupedocker

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

car cela indique à Docker d'utiliser l'utilisateur et le groupe qui sont nommés jenkinset docker dans l'image , et votre image Docker n'a probablement pas l' jenkinsutilisateur et le groupe, et même si c'était le cas, il n'y aurait aucune garantie qu'elle aurait le même UID et GID que l'hôte, et il n'y a pas non plus de garantie que le dockerGID est le même

Heureusement, Jenkins exécute la docker buildcommande pour votre Dockerfile dans un script, vous pouvez donc faire de la magie de script shell pour transmettre ces informations en tant qu'arguments de construction 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'
        }
    }

Cela utilise la idcommande pour obtenir l' UID et le GID de l' jenkinsutilisateur et la statcommande pour obtenir des informations sur le socket Docker.

Votre Dockerfile peut utiliser ces informations pour configurer un jenkinsutilisateur et dockergroupe pour l'agent, en utilisant groupadd, groupmodet 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
Raedwald
la source
C'est une excellente solution complète et la seule qui a fonctionné pour moi lors de l'utilisation du socket docker partagé avec docker via dockerfile. Ce devrait être son propre article de blog. Merci pour cela!
Greg Olmstead
On dirait que tu pourrais passer -u jenkins:$(getent group docker | cut -d: -f3)?
Gillespie
Lors du passage des arguments, il est probablement préférable de changer la ligne suivante: args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'en args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:jenkins --group-add docker' passant -u jenkins: docker, vous changez le groupe d'utilisateurs principal, ce qui signifie que lorsque l'utilisateur écrit un fichier, disons dans l'espace de travail, il définira le fichier l'utilisateur de jenkins et le groupe de docker. Ce n'est probablement pas ce que nous entendons.
Nicolas Forney
8

Jenkins fonctionne dans Docker et Jenkins connecté 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) À l'intérieur du conteneur Docker de Jenkins ( docker exec -it jenkins bashsur 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.

héroïne
la source
C'est la seule solution qui ne nécessite pas de login / login, c'est-à-dire la solution qui fonctionne lorsque vous essayez de l'exécuter dans un script shell.
PV
3

Tout en faisant la configuration de production, j'ai eu le problème d'autorisation.J'ai essayé la solution ci-dessous pour résoudre le problème.

Message d'erreur

ubuntu@node1:~$ docker run hello-world
docker: 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.38/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.

Solution: autorisations du socket indiqué dans le message d'erreur, /var/run/docker.sock:

ubuntu@ip-172-31-21-106:/var/run$ ls -lrth docker.sock
srw-rw---- 1 root root 0 Oct 17 11:08 docker.sock
ubuntu@ip-172-31-21-106:/var/run$ sudo chmod 666 /var/run/docker.sock
ubuntu@ip-172-31-21-106:/var/run$ ls -lrth docker.sock
srw-rw-rw- 1 root root 0 Oct 17 11:08 docker.sock

Après avoir modifié l'autorisation pour docket.sock, exécutez la commande ci-dessous pour vérifier les autorisations.

ubuntu@ip-172-31-21-106:/var/run$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
Srikant Patra
la source
2

Dans mon cas, il était non seulement nécessaire d'ajouter un jenkinsutilisateur au dockergroupe, mais de faire de ce groupe le groupe principal de l' jenkinsutilisateur.

# 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.

Camilo Silva
la source
2

16/02/2019

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

J'ai essayé la commande suivante à partir de l' hôte docker et du 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 à partir de l' hôte docker :

docker exec -t -i my_container_id_or_name /bin/bash

)

Reçu de l' hôte docker :

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

Reçu du conteneur docker :

Nous espérons que vous avez reçu la conférence habituelle de l'administrateur système local. 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 sudopartie de la commande, dans le conteneur docker, j'ai reçu:

usermod: autorisation refusée. usermod: impossible de verrouiller / etc / passwd; Réessayez plus tard.

Solution: je suis entré dans le conteneur docker en cours d'exécution à partir de l' 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 émis la commande suivante:

usermod -a -G docker jenkins

Ensuite, à partir de l' hôte docker , j'ai redémarré mon conteneur docker 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 cela s'est terminé avec succès.

Je n'ai utilisé que l' utilisateur root pour émettre la usermodcommande pour l'utilisateur jenkins.

Z3d4s
la source
2

26/05/2019

Cela a fonctionné pour moi!

Exemple de 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"
pham cuong
la source
2

J'ai rencontré un problème similaire, qui est un problème d'autorisation et la cause de ce problème est que le démon / serveur Docker s'exécute toujours en tant rootqu'utilisateur et souhaite que vous préfacriez toujours la commande docker avec sudo.

Le démon Docker se lie à un socket Unix au lieu d'un port TCP. Par défaut, le socket Unix appartient à l'utilisateur rootet les autres utilisateurs ne peuvent y accéder qu'en utilisantsudo .

Pour résoudre ce problème, voici ce qui a fonctionné pour moi:

Tout d'abord, vérifiez si vous avez déjà créé un groupe de dockers:

cat /etc/group

Si vous ne trouvez pas dockerdans la liste qui s'affiche, vous devrez en créer une:

sudo groupadd docker

Ensuite, confirmez votre useret votre en grouputilisant la commande ci-dessous:

cat /etc/group

Faites défiler pour voir le groupe pour le menu fixe. Il devrait être de ce format

docker:x:140:promisepreston

dockerest mon groupet promiseprestonest monuser

Nous pouvons maintenant ajouter votre utilisateur au groupe Docker

Pour les fichiers de conteneur Docker uniquement:

Copiez et exécutez la commande ci-dessous dans votre terminal exactement comme elle est indiquée sans la modifier de toute façon, quelle que soit l'image / le conteneur / la commande du docker que vous souhaitez exécuter ou que vous essayez d'exécuter ou qui cause le problème d'autorisation:

sudo usermod -aG docker $USER

Après avoir exécuté la commande ci-dessus, vous devrez vous déconnecter et vous reconnecter afin que votre appartenance au groupe soit réévaluée. Cependant, sous Linux, vous pouvez également exécuter la commande suivante ci-dessous pour activer les modifications apportées aux groupes ( Copiez et exécutez la commande ci-dessous dans votre terminal exactement comme elle est indiquée sans la modifier de toute façon, quelle que soit l'image / conteneur / commande du docker qui vous souhaitez exécuter ou essayez d'exécuter ou est en train de casse le problème d'autorisation ):

newgrp docker 

Vous pouvez maintenant vérifier que vous pouvez exécuter des commandes docker sans autorisations sudo, en exécutant à nouveau la commande à l'origine du problème d'autorisations, par exemple ( remplacez my-commandpar le nom de votre image / conteneur / commande ):

docker run my-command

Pour les fichiers Docker et du système de fichiers local:

Si vous disposez d'une copie des fichiers sur votre système de fichiers local, vous pouvez modifier la propriété du répertoire d'application dans lequel les fichiers d'application sont stockés, en utilisant ce format:

sudo​​ ​ chown​​ ​ <your_user>:<your_group>​​ ​ -R​​ my-app-directory/

Donc dans mon cas ce sera:

sudo chown promisepreston:docker -R my-app-directory/

Remarque: veuillez exécuter cette commande dans le répertoire parent contenant le répertoire de l'application.

C'est tout.

J'espère que ça aide

Promesse Preston
la source
1
sudo usermod -a -G docker jenkins
sudo service jenkins restart
Frank Hou
la source
1

J'exécute Jenkins dans un conteneur docker. La solution la plus simple pour moi était de créer une image personnalisée qui définit dynamiquement le GID, comme:

FROM jenkins/jenkins:lts
...
CMD DOCKER_GID=$(stat -c '%g' /var/run/docker.sock) && \
    groupadd -for -g ${DOCKER_GID} docker && \
    usermod -aG docker jenkins && \
    sudo -E -H -u jenkins bash -c /usr/local/bin/jenkins.sh

Voir: https://github.com/jenkinsci/docker/issues/263

Vous pouvez également lancer jenkins avec les options suivantes:

-v /var/run/docker.sock:/var/run/docker.sock \
-u jenkins:$(getent group docker | cut -d: -f3)

Cela suppose que votre image jenkins a un client docker installé. Voir: https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci

Gillespie
la source
1

Si vous pouvez obtenir des erreurs comme ci-dessous,

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock

ou

level=error msg="failed to dial gRPC: cannot connect to the Docker daemon. Is 'docker daemon' running on this host?: dial unix /var/run/docker.sock: connect: permission denied"

Essayez simplement d'exécuter les commandes suivantes,

$ sudo su - jenkins
$ sudo usermod -a -G docker $USER
$ sudo chown jenkins:docker /var/run/docker.sock
lakshmikandan
la source
`sudo usermod -a -G docker $ USER 'demandera le mot de passe de jenkins, je ne sais pas quel est le mot de passe de l'utilisateur.
3lokh
Je pense que vous devriez donner l'autorisation sudo à l'utilisateur Jenkins. ou vous pouvez essayer avec la commande suivante dans l'utilisateur root, usermod -a -G docker jenkinsetchown jenkins:docker /var/run/docker.sock
lakshmikandan
Vous ne devriez pas changer la propriété du socket en jenkins. Et vous devriez exécuter sudo comme n'importe quel utilisateur normal ayant un accès sudo, pas comme jenkins. Qu'est-ce que cette réponse ajoute à la réponse acceptée?
Jim Stewart
1

I`m en utilisant l' officiel image jenkins docker ( https://hub.docker.com/r/jenkins/jenkins ) mais je pense que cette solution est applicable à la plupart des cas d'utilisation où nous voulons exécuter Docker dans un conteneur Docker.

La méthode recommandée pour utiliser Docker dans un conteneur Docker consiste à utiliser le démon Docker du système hôte. Bon article à ce sujet: https://itnext.io/docker-in-docker-521958d34efd .

Le secret pour gérer le problème d'autorisation, sur lequel porte cette question, est d'ajouter des autorisations pour l'utilisateur du conteneur à l'intérieur du conteneur, et non pour le système hôte . Seul l'utilisateur root a l'autorisation de le faire par défaut, donc

docker exec -it -u root <container-name> bash
usermod -a -G docker <username>

le fera. N'oubliez pas de redémarrer le conteneur.

Je suppose que le moyen le plus simple d'y parvenir est de créer un Dockerfile personnalisé:

# Official jenkins image
FROM jenkins/jenkins:lts
# Swith to root to be able to install Docker and modify permissions
USER root
RUN apt-get update
# Install docker
RUN curl -sSL https://get.docker.com/ | sh
# Add jenkins user to docker group
RUN usermod -a -G docker jenkins
# Switch back to default user
USER jenkins

# Bild the image:
# sudo docker build -t yourusername/imagename .
# Run the image and mount with the followin bind mount option:
# sudo docker run --name imagename -d -p8080:8080 -v /var/run/docker.sock:/var/run/docker.sock yourusername/imagename
albin
la source
Pas besoin d'installer un docker entier sur l'image Jenkins, voir ma réponse
deFreitas
1

Si quelqu'un est toujours confronté au problème sur sa machine locale (Ubuntu), essayez la commande ci-dessous:

sudo chmod 666 /var/run/docker.sock
Keshari Nandan
la source
1

Dans mon cas, cela fonctionnera avec succès. naviguez dans votre dépôt local et entrez cette commande.

sudo chmod 666 /var/run/docker.sock
ruwanmadushanka
la source
0

Sur le serveur sur lequel s'exécute Jenkins, j'ai utilisé

sudo setfacl -m user:tomcat:rw /var/run/docker.sock

Et puis exécutez chaque conteneur docker avec

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

Utiliser setfacl semble une meilleure option, et aucun "utilisateur -u" n'est nécessaire. Les conteneurs s'exécutent ensuite sous le même utilisateur que celui qui exécute Jenkins. Mais j'apprécierais les commentaires des experts en sécurité.

java4africa
la source
0

utiliser ci-dessous dockerfile

FROM jenkins/jenkins

USER root

# Install Docker
RUN apt-get update && \
    apt-get -y install apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common && \
    curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
    add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
    $(lsb_release -cs) \
    stable" && \
    apt-get update && \
    apt-get -y install docker-ce


# Compose
RUN curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose



RUN usermod -aG docker jenkins
RUN usermod -aG root jenkins

USER jenkins
Eslamspot
la source
0

dans mon cas, il s'agissait juste de démarrer le service docker:

sudo service docker start
Badr Bellaj
la source
0

ont souvent besoin d'un redémarrage pour prendre effet sur le nouveau groupe d'utilisateurs et l'utilisateur.

Fahad
la source
0

Si vous exécutez Jenkins dans un conteneur docker et que votre Jenkins est lié au docker hôte, vous pouvez résoudre ce problème uniquement par le Dockerfile ci-dessous:

FROM jenkins/jenkins:2.179
USER root
RUN groupadd docker && usermod -a -G docker jenkins
USER jenkins 
deFreitas
la source
-6

Peut-être devriez-vous lancer le docker avec l'option "-u root" depuis le tout début

Au moins ça a résolu mon problème

Anders K.
la source
1
Ensuite, vous pouvez créer des fichiers en tant qu'utilisateur root. Au moins, c'est ce qui m'est arrivé, avec Docker 18.06.1.
Ernst de Haan