it-swarm.com.de

Die Berechtigung wurde verweigert, als versucht wurde, eine Verbindung zum Docker-Daemon-Socket unter unix: ///var/run/docker.sock herzustellen

Ich bin neu im Docker. Ich habe gerade versucht, Docker in meinem lokalen Rechner (Ubuntu 16.04) mit Jenkins zu verwenden. 

Ich habe einen neuen Job mit dem folgenden Pipeline-Skript konfiguriert.

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

Aber mit fehlendem Fehler scheitert es.

 enter image description here

42

Der Benutzer jenkins muss der Gruppe docker hinzugefügt werden:

Sudo usermod -a -G docker jenkins

Starten Sie dann Jenkins erneut.

76
austingray

Meine ersten Lösungen waren:

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

Aber keiner von ihnen arbeitet für mich, ich habe versucht:

chmod 777 /var/run/docker.sock

Das funktioniert, aber ich weiß nicht, ob es der richtige Anruf ist.

14
Kevin Garay

Ich habe den Jenkins-Benutzer zur Root-Gruppe hinzugefügt und die Jenkins neu gestartet, und es begann zu arbeiten. 

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

Erfolg für mich

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

Ich habe Jenkins in Docker ausgeführt und Jenkins verwendet Docker-Socket vom Host-Computer Ubuntu 16.04 über das Volume nach /var/run/docker.sock.

Für mich war die Lösung:

1) Innerhalb des Docker-Containers von Jenkins (docker exec -it jenkins bash auf dem Host-Computer)

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

2) auf der Hostmaschine:

Sudo service docker restart

664 bedeutet - lesen und schreiben (aber nicht ausführen) für Besitzer und Benutzer aus der Gruppe.

5
heroin

2018-08-19

Ich bin seit Tagen festgefahren und da ich keine vollständige Antwort mit dem Warum und Wie gefunden habe, werde ich eine für andere Leute posten, die auf das gleiche Problem stoßen und die Antworten von oben nicht funktionieren.

Dies sind die drei wichtigsten Schritte, wenn Sie Jenkins im Docker ausführen:

  1. Sie mounten den Socket /var/run/docker.sock im Jenkins-Container, um das Docker vom Host aus verwenden zu können.
  2. Sie müssen das Docker im Container installieren, um es verwenden zu können. Dieser ist ein großartiger und einfacher Artikel, wie das geht.
  3. Sie führen Sudo usermod -a -G docker jenkins aus, um der Andockgruppe Jenkins hinzuzufügen. Hier könnte jedoch ein Berechtigungsproblem auftreten, wenn das Host-Docker und das Container-Docker nicht die gleiche Gruppen-ID haben, also es ist sehr wichtig, die GID des Container-Dockers so einzustellen, dass sie der Host-Docker-GID entspricht.

Sie können dies als Teil eines Startskripts tun oder einfach mit exec und manuell: groupmod -g <YOUR_Host_DOCKER_GID> docker.

Ändern Sie auch nicht die Berechtigungen des /var/run/docker.sock in 777 oder ähnliches, da dies ein großes Sicherheitsrisiko darstellt.

Hoffe das hilft

4
Urosh T.

Einfach Hinzufügen von docker als ergänzende Gruppe für den Benutzer jenkins

Sudo usermod -a -G docker jenkins

ist nicht immer ausreichend, wenn ein Docker-Image als Jenkins Agent verwendet wird. Das heißt, wenn Ihr Jenkinsfile mit pipeline{agent{dockerfile Oder pipeline{agent{image Beginnt:

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

Dies liegt daran, dass Jenkins den Befehl docker run ausführt, was zu drei Problemen führt.

  • Auf dem Agent sind (wahrscheinlich) keine Docker-Programme installiert.
  • Der Agent hat keinen Zugriff auf den Docker-Daemon-Socket und versucht daher, Docker-in-Docker auszuführen. Dies ist nicht empfohlen .
  • Jenkins gibt die numerische Benutzer-ID und die numerische Gruppen-ID an, die der Agent verwenden soll. Der Agent hat keine zusätzlichen Gruppen, da docker run Keine Anmeldung am Container vornimmt (es ist eher ein Sudo).

Docker für den Agenten installieren

Um die Docker-Programme im Docker-Image verfügbar zu machen, müssen Sie lediglich die Schritte Docker-Installationsschritte in Ihrer Docker-Datei ausführen:

# 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

...

Gemeinsame Nutzung des Docker-Daemon-Sockets

Wie wurde bereits erwähnt bedeutet das Beheben des zweiten Problems, dass der Jenkins Docker-Container so ausgeführt wird, dass er den Docker-Daemon-Socket mit dem Docker-Daemon teilt, der außerhalb des Containers ist. Sie müssen Jenkins also anweisen, den Docker-Container mit dieser Freigabe auszuführen.

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

Festlegen von UIDs und GIDs

Die ideale Lösung für das dritte Problem wäre die Einrichtung zusätzlicher Gruppen für den Agenten. Das scheint nicht möglich zu sein. Das einzige Update, das mir bekannt ist, besteht darin, den Agenten mit der Jenkins-UID und der Docker-GID auszuführen (der Socket verfügt über Gruppenschreibberechtigungen und ist im Besitz von root.docker). Im Allgemeinen wissen Sie jedoch nicht, wie diese IDs lauten (sie wurden zugewiesen, als useradd ... jenkins Und groupadd ... docker Ausgeführt wurden, als Jenkins und Docker auf dem Host installiert wurden). Und Sie können Jenkins nicht einfach dem Benutzer user jenkins und group docker mitteilen.

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

weil das Docker anweist, den Benutzer und die Gruppe mit den Namen jenkins und docker im Bild zu verwenden , und Ihr Docker-Image hat wahrscheinlich nicht den Benutzer und die Gruppe jenkins, und auch wenn dies der Fall wäre es gibt keine Garantie dafür, dass es dasselbe hat UID und GID als Host, und es gibt ebenfalls keine Garantie dafür, dass die GID docker identisch ist

Glücklicherweise führt Jenkins den Befehl docker build Für Ihre Docker-Datei in einem Skript aus, sodass Sie mit etwas Shell-Skript-Magie diese Informationen als Docker-Build-Argumente übergeben können:

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'
        }
    }

Mit dem Befehl id werden die Befehle UID und GID abgerufen des Benutzers jenkins und des Befehls stat , um Informationen zum Docker-Socket abzurufen.

Ihre Docker-Datei kann diese Informationen verwenden, um einen jenkins Benutzer und eine docker Gruppe für den Agenten einzurichten. Verwenden Sie dazu groupadd , groupmod und 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

26.05.2019

Dies hat für mich gearbeitet!

Beispiel 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

Die meisten Schritte waren für mich die gleichen, wie die anderen geschrieben haben . Allerdings konnte ich mit den genannten Lösungen keine Jenkins zum Docker der Gruppe hinzufügen.

Ich habe den folgenden Befehl aus dem docker-Host und aus dem ausgeführten Docker-Container ausprobiert: 

Sudo usermod -a -G docker jenkins

(Ich habe den running docker container mit dem folgenden Befehl vom docker Host eingegeben): 

docker exec -t -i my_container_id_or_name /bin/bash

)

Erhalten von docker Host:

usermod: Benutzer 'Jenkins' existiert nicht

Erhalten von Docker-Container:

Wir hoffen, dass Sie den üblichen Vortrag aus dem lokalen System erhalten haben Administrator. Es läuft normalerweise auf diese drei Dinge hinaus:

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

[Sudo] Passwort für Jenkins:

Ich wusste das Passwort nicht.

Ohne den Sudo-Teil des Befehls erhielt ich im docker-Container Folgendes:

usermod: Erlaubnis verweigert. usermod: kann/etc/passwd nicht sperren; Versuchen später wieder.

Lösung: Ich habe den docker-Host mit dem folgenden Befehl in den running Docker-Container eingegeben:

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

Nun habe ich als root eingegeben und folgenden Befehl ausgegeben:

usermod -a -G docker jenkins

Dann habe ich vom docker-Host meinen running Docker-Container mit dem folgenden Befehl neu gestartet:

docker restart my_container_id_or_name

Danach begann ich den Job von Jenkins und es wurde mit Erfolg abgeschlossen.

Ich habe nur den root user verwendet, um den Befehl usermod für den Benutzer jenkins auszuführen.

0
Z3d4s

Schauen Sie sich dieses Docker-Image an, das ich für die Verwendung von Jenkins mit Docker erstellt habe . https://hub.docker.com/r/fristonio/jenkins_docker/

Lesen Sie die Anweisungen zur Verwendung. Sie können auch die Docker-Datei hier betrachten.

0
Deepesh Pathak

Auf dem Server, auf dem Jenkins läuft, habe ich verwendet

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

Und dann starte jeden Docker Container mit

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

Die Verwendung von setfacl scheint eine bessere Option zu sein, und es wird kein "-u Benutzer" benötigt. Die Container werden dann als derselbe Benutzer ausgeführt, auf dem Jenkins ausgeführt wird. Aber ich würde mich über Feedback von den Sicherheitsexperten freuen.

0
java4africa

In meinem Fall musste nicht nur jenkins user zur docker-Gruppe hinzugefügt werden, sondern diese Gruppe sollte die primäre Gruppe des jenkins-Benutzers sein.

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

Vergessen Sie nicht, den Jenkins-Slave-Knoten erneut zu verbinden oder den Jenkins-Server neu zu starten, abhängig von Ihrem Fall. 

0
Camilo Silva