Docker: Beim Versuch, eine Verbindung zum Docker-Daemon-Socket unter Unix herzustellen: ///var/run/docker.sock, wurde die Berechtigung verweigert

172

Ich bin neu bei Docker. Ich habe gerade versucht, Docker in meinem lokalen Computer (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 es schlägt mit dem folgenden Fehler fehl.

Geben Sie hier die Bildbeschreibung ein

Ponsuyambu Velladurai
quelle
1
Ist es ein monolithischer Jenkins oder hat er ein Master-Slave-Setup? Überprüfen Sie, mit welchem ​​Benutzer Sie den Docker-Inspektionsbefehl ausführen. Überprüfen Sie, ob /var/run/docker.sock RW-Zugriff auf die Gruppe hat.
Ram Kamath
2
Schritte nach der Installation des Dockers
Radistao

Antworten:

290

Der Benutzer jenkinsmuss der Gruppe hinzugefügt werden docker:

sudo usermod -a -G docker jenkins

Starten Sie dann Jenkins neu.

Bearbeiten

Wenn Sie zu dieser Frage des Stapelüberlaufs kommen, weil Sie diese Nachricht vom Docker erhalten, aber keine Jenkins verwenden, ist der Fehler höchstwahrscheinlich der gleiche: Ihr nicht privilegierter Benutzer gehört nicht zur Docker-Gruppe.

Du kannst tun:

sudo usermod -a -G docker alice

oder was auch immer Ihr Benutzername ist.

Sie können es am Ende überprüfen grep docker /etc/groupund so etwas sehen:

docker:x:998:alice

in einer der Zeilen.

Ändern Sie dann die Benutzergruppen-ID in docker:

newgrp docker
austingray
quelle
88
und Benutzer neu anmelden
Ilya Kolesnikov
8
Gute Antwort, aber um allgemeiner zu sein, könnten wir dies tun: sudo usermod -a -G docker $USERabmelden oder neu starten. Link
Julien Nyambal
10
Ich musste meinen Server neu starten, damit dies tatsächlich funktioniert.
Etagwerker
3
Ich musste meine Knoten trennen / wieder verbinden, damit dies funktioniert (sie sind über ssh verbunden)
GaspardP
28
Sie müssen sich nicht erneut anmelden, newgrp dockersondern verwenden es stattdessen in derselben Terminalsitzung.
C14L
68

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.

Kevin Garay
quelle
4
Der Grund, warum es fehlgeschlagen ist, ist wahrscheinlich, dass Sie das Terminal erneut öffnen mussten. Es schlug fehl, nachdem ich 664 gemacht hatte, aber dann öffnete ich eine neue Shell, die funktionierte.
PHGamer
1
Ich habe versucht, wieder zu öffnen, aber es begann erst nach dem letzten chmod 777
ironisch
Das Problem war, dass nach dem Neustart 777 auf 660 zurückgesetzt wurde. Was das Problem für mich behoben hat, war 'usermod -aG users jenkins'.
ironisch
Ich weiß, dass es zurückgesetzt wurde, aber setzen Sie die docker.sock-Berechtigungen nicht auf 777. Dies gibt jedem Root auf Ihrem System. Sie können mit Docker sprechen und ohne Einschränkungen privilegierte Container erstellen.
Lance Hudson
3
Obwohl dies für den Autor und sogar für mich funktioniert hat, docker.sockist es nicht die beste Lösung, mehr Zugriff auf die Datei zu gewähren. Sie müssen nur die usermod... Anweisungen ausführen und dann Ihr System neu starten, sonst wird es nicht wirksam
Mariano Ruiz
32

Erfolg für mich

sudo usermod -a -G docker $USER
reboot
Shellhub
quelle
4
Kein Neustart erforderlich. Einfach abmelden und dann erneut anmelden. Ich spreche von Usermod
Abdennour TOUMI
1
Unter Ubuntu 18.04 musste ich neu starten, damit die Einstellung funktioniert.
Nikhil
1
Unter Ubuntu 20.04 brauchte ich den Neustart. Sitzung schließen nicht genug.
Framontb
Oder führen Sie su $ {USER} aus, anstatt sich
abzumelden
18

2018-08-19

Ich bin seit Tagen in diesem Fall festgefahren und da ich keine vollständige Antwort mit dem Warum und Wie gefunden habe, werde ich eine für andere Personen veröffentlichen, die über dasselbe Problem stolpern und Antworten von oben funktionieren nicht.

Dies sind die drei entscheidenden Schritte beim Ausführen von Jenkins im Docker:

  1. Sie hängen den Socket /var/run/docker.sockan den Jenkins-Container an, um den Docker vom Host aus verwenden zu können.
  2. Sie müssen Docker im Container installieren, um ihn verwenden zu können. Dies ist ein großartiger und einfacher Artikel darüber, wie das geht. Beachten Sie, dass in neueren Versionen möglicherweise bereits Docker installiert ist
  3. Sie werden ausgeführt sudo usermod -a -G docker jenkins, um der Docker-Gruppe Jenkins hinzuzufügen. Hier kann es jedoch zu einem Berechtigungsproblem kommen, wenn der Host-Docker und der Container-Docker nicht dieselbe Gruppen-ID haben. Daher ist es sehr wichtig, die GID des Container-Dockers so anzupassen, dass sie mit der Gid des Host-Dockers übereinstimmt

Sie können dies als Teil eines Startskripts oder einfach durch execmanuelles Verwenden und Ausführen tun : groupmod -g <YOUR_HOST_DOCKER_GID> docker.

Auch nicht über die Berechtigungen ändern von der /var/run/docker.sockso auf 777 oder Sachen , weil das ein großes Sicherheitsrisiko ist, sind Sie im Grunde gibt jeden Erlaubnis Gebrauch Docker auf Ihrem Rechner

Hoffe das hilft

Urosh T.
quelle
1
Vielen Dank - beachten Sie, dass für die aktuellen Jenkins Docker-Images die Docker-Befehle bereits installiert sind (und apt-get nicht). Ihre anderen Punkte - das Hinzufügen von Jenkins zur richtigen Gruppe und das Sicherstellen, dass die GID mit der vom Docker-Host übereinstimmt, bleiben erhalten genau richtig.
Steve Bonds
13

Ich habe den Jenkins-Benutzer zur Stammgruppe hinzugefügt und die Jenkins neu gestartet, und es hat funktioniert.

sudo usermod -a -G root jenkins
sudo service jenkins restart
Ponsuyambu Velladurai
quelle
16
Dies ist eine schlechte Sicherheitspraxis. Der bevorzugte Ansatz ist diese Antwort .
Kevindaub
10

Ändern Sie die Zugriffsberechtigung der Datei docker.sock

chmod 777 /var/run/docker.sock

oder du kannst verwenden sudo am Anfang des Befehls verwenden.

chmod 777Ermöglicht alle Aktionen für alle Benutzer, während chmod 666alle Benutzer lesen und schreiben können, die Datei jedoch nicht ausführen können.

USMAN FAZIL
quelle
Das habe ich gebraucht, danke!
Crazynx
9

Einfachdocker als zusätzliche Gruppe für den jenkinsBenutzer hinzufügen

sudo usermod -a -G docker jenkins

ist nicht immer genug, wenn Sie ein Docker-Image als Jenkins-Agent verwenden . Das heißt, wenn Sie Jenkinsfilemit pipeline{agent{dockerfileoder beginnen pipeline{agent{image:

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

Dies liegt daran, dass Jenkins einen docker runBefehl ausführt , was zu drei Problemen führt.

  • Auf dem Agenten sind (wahrscheinlich) die Docker-Programme nicht installiert.
  • Der Agent hat keinen Zugriff auf den Docker-Daemon-Socket und versucht daher, Docker-in-Docker auszuführen, was nicht empfohlen wird .
  • 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 er docker runsich nicht beim Container anmeldet (es ist eher wie bei a sudo).

Docker für den Agenten installieren

Um die Docker-Programme im Docker-Image verfügbar zu machen, müssen lediglich die Docker-Installationsschritte in Ihrer Docker- Datei ausgeführt werden:

# 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

...

Freigeben des Docker-Daemon-Sockets

Wie 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 sich außerhalb des Containers befindet. 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 das Einrichten zusätzlicher Gruppen für den Agenten. Das scheint nicht möglich zu sein. Die einzige mir bekannte Lösung besteht darin, den Agenten mit der Jenkins-UID und der Docker-GID auszuführen (der Socket verfügt über eine Gruppenschreibberechtigung und gehört ihm root.docker). Im Allgemeinen wissen Sie jedoch nicht, um welche IDs es sich handelt (sie wurden zugewiesen, als die ausgeführt wurden, useradd ... jenkinsund ausgeführt, groupadd ... dockerals Jenkins und Docker auf dem Host installiert wurden). Und Sie können Jenkins nicht einfach dem Benutzer jenkinsund der Gruppe mitteilendocker

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

weil die Docker die Benutzer und die Gruppe zu verwenden , sagt , die benannt sind jenkinsund docker innerhalb des Bildes , und Sie wahrscheinlich Docker Bild nicht über die jenkinsBenutzer und die Gruppe, und selbst wenn es so wäre keine Garantie gäbe es die gleiche UID und GID haben würde als der Host, und es gibt ebenfalls keine Garantie dafür, dass die dockerGID gleich ist

Glücklicherweise führt Jenkins den docker buildBefehl für Ihre Docker-Datei in einem Skript aus, sodass Sie Shell-Skript-Magie anwenden können, um diese Informationen als Docker-Build-Argumente zu übergeben:

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

Dabei werden der idBefehl zum Abrufen der UID und der GID des jenkinsBenutzers und der statBefehl zum Abrufen von Informationen zum Docker-Socket verwendet.

Ihre Dockerfile können diese Informationen für das Einrichten eines verwenden jenkinsBenutzer und dockerGruppe für die Agenten, mit groupadd, groupmodund 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
quelle
Dies ist eine ausgezeichnete umfassende Lösung und die einzige, die für mich funktioniert hat, wenn Docker-Socket verwendet wird, der über Docker-Datei für Docker freigegeben wurde. Es sollte ein eigener Blog-Beitrag sein. Danke dafür!
Greg Olmstead
Scheint, als könntest du bestehen -u jenkins:$(getent group docker | cut -d: -f3)?
Gillespie
Wenn die args vorbei, dann ist es wahrscheinlich besser , die folgende Zeile zu ändern: args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'durch args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:jenkins --group-add docker' Beim Passieren -u jenkins: Docker, können Sie die primäre Benutzergruppe ändern, was bedeutet , wenn der Benutzer Schreib eine Datei, sagt sie im Arbeitsbereich läßt, wird die Datei ! Benutzer zu Jenkins und die Gruppe zu Docker. Welches ist wahrscheinlich nicht das, was wir beabsichtigen.
Nicolas Forney
8

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

Für mich war die Lösung:

1) Im Docker-Container von Jenkins ( docker exec -it jenkins bashauf 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 dem Host-Computer:

sudo service docker restart

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

Heroin
quelle
Dies ist die einzige Lösung, für die kein Login / Login erforderlich ist, dh die Lösung, die funktioniert, wenn versucht wird, dies in einem Shell-Skript auszuführen.
PV
3

Während der Produktionskonfiguration habe ich das Berechtigungsproblem erhalten. Ich habe die folgende Lösung versucht, um das Problem zu beheben.

Fehlermeldung

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

Lösung: Berechtigungen des Sockets in der Fehlermeldung /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

Nachdem Sie die Berechtigung für docket.sock geändert haben, führen Sie den folgenden Befehl aus, um die Berechtigungen zu überprüfen.

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
quelle
2

In meinem Fall war es nicht nur erforderlich, einen jenkinsBenutzer zur dockerGruppe hinzuzufügen , sondern diese Gruppe zur primären Gruppe des jenkinsBenutzers zu machen.

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

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

Camilo Silva
quelle
2

2019-02-16

Die meisten Schritte waren für mich die gleichen wie die anderen geschrieben haben. Mit usermod konnte ich jedoch mit usermod mit den genannten Lösungen keine Jenkins zum Gruppendock hinzufügen.

Ich habe den folgenden Befehl vom Docker-Host und vom laufenden Docker-Container aus versucht :

sudo usermod -a -G docker jenkins

(Ich habe den laufenden Docker-Container mit dem folgenden Befehl vom Docker-Host aufgerufen :

docker exec -t -i my_container_id_or_name /bin/bash

)

Vom Docker-Host erhalten :

usermod: Benutzer 'jenkins' existiert nicht

Vom Docker-Container erhalten :

Wir vertrauen darauf, dass Sie den üblichen Vortrag vom lokalen Systemadministrator erhalten haben. 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 kannte das Passwort nicht.

Ohne den sudoTeil des Befehls erhielt ich im Docker-Container Folgendes :

usermod: Erlaubnis verweigert. usermod: kann / etc / passwd nicht sperren; Versuchen Sie es später noch einmal.

Lösung: Ich habe vom Docker-Host aus den folgenden Docker-Container mit dem folgenden Befehl aufgerufen :

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

Jetzt habe ich als root eingegeben und den folgenden Befehl ausgegeben:

usermod -a -G docker jenkins

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

docker restart my_container_id_or_name

Danach habe ich den Jenkins-Job angefangen und er endete mit Erfolg.

Ich habe nur den Root- Benutzer verwendet, um den usermodBefehl für den Benutzer auszugeben jenkins.

Z3d4s
quelle
2

2019-05-26

Das hat bei mir funktioniert!

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"
Pham Cuong
quelle
2

Ich hatte ein ähnliches Problem, bei dem es sich um ein Berechtigungsproblem handelt. Die Ursache für dieses Problem liegt darin, dass der Docker-Dämon / -Server immer als rootBenutzer ausgeführt wird und Sie dem Docker-Befehl immer ein Vorwort geben sollen sudo.

Der Docker-Daemon wird anstelle eines TCP-Ports an einen Unix-Socket gebunden. Standardmäßig gehört dieser Unix-Socket dem Benutzer, rootund andere Benutzer können nur mit darauf zugreifensudo .

Um dies zu beheben, hat Folgendes für mich funktioniert:

Überprüfen Sie zunächst, ob bereits eine Docker-Gruppe erstellt wurde:

cat /etc/group

Wenn Sie dockerin der angezeigten Liste nichts finden , müssen Sie eine erstellen:

sudo groupadd docker

Bestätigen Sie userals Nächstes Ihre und Ihre groupVerwendung mit dem folgenden Befehl:

cat /etc/group

Scrollen Sie durch, um die Gruppe für Docker anzuzeigen. Es sollte dieses Format haben

docker:x:140:promisepreston

Wo dockerist mein groupund promiseprestonist meinuser

Jetzt können wir Ihren Benutzer zur Docker-Gruppe hinzufügen

Nur für Docker-Container-Dateien:

Kopieren Sie den folgenden Befehl in Ihr Terminal und führen Sie ihn genau so aus, wie er angegeben ist, ohne ihn zu ändern, unabhängig davon, welches Docker-Image / Container / Befehl Sie ausführen möchten oder ausführen möchten oder das Berechtigungsproblem auslösen:

sudo usermod -aG docker $USER

Nachdem Sie den obigen Befehl ausgeführt haben, müssen Sie sich abmelden und wieder anmelden, damit Ihre Gruppenmitgliedschaft neu bewertet wird. Unter Linux können Sie jedoch auch den folgenden Befehl ausführen, um die Änderungen an Gruppen zu aktivieren ( Kopieren Sie den folgenden Befehl in Ihrem Terminal und führen Sie ihn genau so aus, wie er angegeben ist, ohne ihn zu ändern, unabhängig davon, welches Docker-Image / Container / Befehl dies ist Sie möchten ausführen oder versuchen auszuführen oder werfen das Berechtigungsproblem auf ):

newgrp docker 

Sie können jetzt überprüfen, ob Sie Docker-Befehle ohne Sudo-Berechtigungen ausführen können, indem Sie den Befehl ausführen, der das Berechtigungsproblem erneut verursacht, z. B. ( Ersetzen)my-command durch den Namen Ihres Images / Containers / Befehls ):

docker run my-command

Für Docker- und lokale Dateisystemdateien:

Wenn Sie eine Kopie der Dateien in Ihrem lokalen Dateisystem haben, können Sie den Besitz des Anwendungsverzeichnisses, in dem die Anwendungsdateien gespeichert sind, in folgendem Format ändern:

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

In meinem Fall wird es also sein:

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

Hinweis: Führen Sie diesen Befehl im übergeordneten Verzeichnis aus, in dem sich das Anwendungsverzeichnis befindet.

Das ist alles.

ich hoffe das hilft

Versprich Preston
quelle
1
sudo usermod -a -G docker jenkins
sudo service jenkins restart
Frank Hou
quelle
1

Ich lasse Jenkins in einem Docker-Container laufen. Die einfachste Lösung für mich war, ein benutzerdefiniertes Bild zu erstellen, das die GID dynamisch festlegt, wie:

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

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

Alternativ können Sie Jenkins mit den folgenden Optionen starten:

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

Dies setzt voraus, dass auf Ihrem Jenkins-Image der Docker-Client installiert ist. Siehe: https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci

Gillespie
quelle
1

Wenn Sie Fehler wie unten erhalten,

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

oder

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"

Versuchen Sie einfach, die folgenden Befehle auszuführen:

$ sudo su - jenkins
$ sudo usermod -a -G docker $USER
$ sudo chown jenkins:docker /var/run/docker.sock
Lakshmikandan
quelle
`sudo usermod -a -G docker $ USER 'fragt nach dem Passwort von Jenkins, nicht sicher, wie das Benutzerpasswort lautet.
3lokh
Ich denke, Sie sollten dem Jenkins-Benutzer die Sudo-Erlaubnis geben. oder Sie können mit dem folgenden Befehl in root user versuchen, usermod -a -G docker jenkinsundchown jenkins:docker /var/run/docker.sock
lakshmikandan
Sie sollten den Besitz der Steckdose nicht in Jenkins ändern. Und Sie sollten sudo so ausführen, wie jeder normale Benutzer sudo-Zugriff hat, nicht als Jenkins. Was trägt diese Antwort zur akzeptierten Antwort bei?
Jim Stewart
1

Ich verwende das offizielle Docker-Image von Jenkins ( https://hub.docker.com/r/jenkins/jenkins) ), aber ich denke, diese Lösung ist für die meisten Anwendungsfälle anwendbar, in denen Docker in einem Docker-Container ausgeführt werden soll.

Die empfohlene Methode zur Verwendung von Docker in einem Docker-Container ist die Verwendung des Docker-Deamons des Hostsystems. Guter Artikel dazu: https://itnext.io/docker-in-docker-521958d34efd .

Das Geheimnis zur Behandlung des Berechtigungsproblems, um das es in dieser Frage geht, besteht darin, Berechtigungen für den Benutzer des Containers innerhalb des Containers und nicht für das Hostsystem hinzuzufügen . Dies ist standardmäßig nur für Root-Benutzer zulässig

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

werde es tun. Denken Sie daran, den Container neu zu starten.

Ich denke, der einfachste Weg, dies zu erreichen, besteht darin, eine angepasste Docker-Datei zu erstellen:

# 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
quelle
Sie müssen kein komplettes Docker auf Jenkins Image installieren, siehe meine Antwort
deFreitas
1

Wenn jemand auf seinem lokalen Computer (Ubuntu) immer noch mit dem Problem konfrontiert ist, versuchen Sie es mit dem folgenden Befehl:

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

In meinem Fall wird dies erfolgreich funktionieren. Navigieren Sie in Ihrem lokalen Repo und geben Sie diesen Befehl ein.

sudo chmod 666 /var/run/docker.sock
Ruwanmadushanka
quelle
0

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

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

Führen Sie dann jeden Docker-Container mit aus

-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, der Jenkins ausführt. Aber ich würde mich über jedes Feedback der Sicherheitsexperten freuen.

java4africa
quelle
0

Verwenden Sie unten Docker-Datei

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
quelle
0

In meinem Fall wurde gerade der Docker-Dienst gestartet:

sudo service docker start
Badr Bellaj
quelle
0

Oft muss ein Neustart durchgeführt werden, um die neue Benutzergruppe und den neuen Benutzer zu beeinflussen.

Fahad
quelle
0

Wenn Sie Jenkins in einem Docker-Container ausführen und Ihr Jenkins eine Verbindung zum Host-Docker herstellt, können Sie dies einfach über die folgende Docker-Datei beheben:

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

Vielleicht sollten Sie den Docker von Anfang an mit der Option "-u root" ausführen

Zumindest hat das mein Problem gelöst

Anders K.
quelle
1
Dann werden möglicherweise Dateien als Benutzer erstellt root. Zumindest ist mir das mit Docker 18.06.1 passiert.
Ernst de Haan