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.
docker
jenkins
jenkins-pipeline
Ponsuyambu Velladurai
quelle
quelle
Antworten:
Der Benutzer
jenkins
muss der Gruppe hinzugefügt werdendocker
: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:
oder was auch immer Ihr Benutzername ist.
Sie können es am Ende überprüfen
grep docker /etc/group
und so etwas sehen:in einer der Zeilen.
Ändern Sie dann die Benutzergruppen-ID in
docker
:quelle
sudo usermod -a -G docker $USER
abmelden oder neu starten. Linknewgrp docker
sondern verwenden es stattdessen in derselben Terminalsitzung.Meine ersten Lösungen waren:
Aber keiner von ihnen arbeitet für mich, ich habe versucht:
Das funktioniert, aber ich weiß nicht, ob es der richtige Anruf ist.
quelle
docker.sock
ist es nicht die beste Lösung, mehr Zugriff auf die Datei zu gewähren. Sie müssen nur dieusermod
... Anweisungen ausführen und dann Ihr System neu starten, sonst wird es nicht wirksamErfolg für mich
quelle
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:
/var/run/docker.sock
an den Jenkins-Container an, um den Docker vom Host aus verwenden zu können.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 übereinstimmtSie können dies als Teil eines Startskripts oder einfach durch
exec
manuelles Verwenden und Ausführen tun :groupmod -g <YOUR_HOST_DOCKER_GID> docker
.Auch nicht über die Berechtigungen ändern von der
/var/run/docker.sock
so auf 777 oder Sachen , weil das ein großes Sicherheitsrisiko ist, sind Sie im Grunde gibt jeden Erlaubnis Gebrauch Docker auf Ihrem RechnerHoffe das hilft
quelle
Ich habe den Jenkins-Benutzer zur Stammgruppe hinzugefügt und die Jenkins neu gestartet, und es hat funktioniert.
quelle
Ändern Sie die Zugriffsberechtigung der Datei docker.sock
oder du kannst verwenden
sudo
am Anfang des Befehls verwenden.chmod 777
Ermöglicht alle Aktionen für alle Benutzer, währendchmod 666
alle Benutzer lesen und schreiben können, die Datei jedoch nicht ausführen können.quelle
Einfach
docker
als zusätzliche Gruppe für denjenkins
Benutzer hinzufügenist nicht immer genug, wenn Sie ein Docker-Image als Jenkins-Agent verwenden . Das heißt, wenn Sie
Jenkinsfile
mitpipeline{agent{dockerfile
oder beginnenpipeline{agent{image
:Dies liegt daran, dass Jenkins einen
docker run
Befehl ausführt , was zu drei Problemen führt.docker run
sich nicht beim Container anmeldet (es ist eher wie bei asudo
).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:
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.
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 ... jenkins
und ausgeführt,groupadd ... docker
als Jenkins und Docker auf dem Host installiert wurden). Und Sie können Jenkins nicht einfach dem Benutzerjenkins
und der Gruppe mitteilendocker
weil die Docker die Benutzer und die Gruppe zu verwenden , sagt , die benannt sind
jenkins
unddocker
innerhalb des Bildes , und Sie wahrscheinlich Docker Bild nicht über diejenkins
Benutzer 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 diedocker
GID gleich istGlücklicherweise führt Jenkins den
docker build
Befehl 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:Dabei werden der
id
Befehl zum Abrufen der UID und der GID desjenkins
Benutzers und derstat
Befehl zum Abrufen von Informationen zum Docker-Socket verwendet.Ihre Dockerfile können diese Informationen für das Einrichten eines verwenden
jenkins
Benutzer unddocker
Gruppe für die Agenten, mitgroupadd
,groupmod
unduseradd
:quelle
-u jenkins:$(getent group docker | cut -d: -f3)
?args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'
durchargs '-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.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 bash
auf dem Host-Computer)2) Auf dem Host-Computer:
664
bedeutet - lesen und schreiben (aber nicht ausführen) für Eigentümer und Benutzer aus der Gruppe.quelle
Während der Produktionskonfiguration habe ich das Berechtigungsproblem erhalten. Ich habe die folgende Lösung versucht, um das Problem zu beheben.
Fehlermeldung
Lösung: Berechtigungen des Sockets in der Fehlermeldung /var/run/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.
quelle
In meinem Fall war es nicht nur erforderlich, einen
jenkins
Benutzer zurdocker
Gruppe hinzuzufügen , sondern diese Gruppe zur primären Gruppe desjenkins
Benutzers zu machen.Vergessen Sie nicht, den Jenkins-Slave-Knoten erneut anzuschließen oder den Jenkins-Server neu zu starten, abhängig von Ihrem Fall.
quelle
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 :
(Ich habe den laufenden Docker-Container mit dem folgenden Befehl vom Docker-Host aufgerufen :
)
Vom Docker-Host erhalten :
Vom Docker-Container erhalten :
Ich kannte das Passwort nicht.
Ohne den
sudo
Teil des Befehls erhielt ich im Docker-Container Folgendes :Lösung: Ich habe vom Docker-Host aus den folgenden Docker-Container mit dem folgenden Befehl aufgerufen :
Jetzt habe ich als root eingegeben und den folgenden Befehl ausgegeben:
Dann habe ich vom Docker-Host aus meinen laufenden Docker-Container mit dem folgenden Befehl neu gestartet :
Danach habe ich den Jenkins-Job angefangen und er endete mit Erfolg.
Ich habe nur den Root- Benutzer verwendet, um den
usermod
Befehl für den Benutzer auszugebenjenkins
.quelle
2019-05-26
Das hat bei mir funktioniert!
Beispiel Docker-Compose:
quelle
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
root
Benutzer ausgeführt wird und Sie dem Docker-Befehl immer ein Vorwort geben sollensudo
.Der Docker-Daemon wird anstelle eines TCP-Ports an einen Unix-Socket gebunden. Standardmäßig gehört dieser Unix-Socket dem Benutzer,
root
und 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:
Wenn Sie
docker
in der angezeigten Liste nichts finden , müssen Sie eine erstellen:Bestätigen Sie
user
als Nächstes Ihre und Ihregroup
Verwendung mit dem folgenden Befehl:Scrollen Sie durch, um die Gruppe für Docker anzuzeigen. Es sollte dieses Format haben
Wo
docker
ist meingroup
undpromisepreston
ist 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:
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 ):
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 ):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:
In meinem Fall wird es also sein:
Hinweis: Führen Sie diesen Befehl im übergeordneten Verzeichnis aus, in dem sich das Anwendungsverzeichnis befindet.
Das ist alles.
ich hoffe das hilft
quelle
quelle
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:
Siehe: https://github.com/jenkinsci/docker/issues/263
Alternativ können Sie Jenkins mit den folgenden Optionen starten:
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
quelle
Wenn Sie Fehler wie unten erhalten,
oder
Versuchen Sie einfach, die folgenden Befehle auszuführen:
quelle
usermod -a -G docker jenkins
undchown jenkins:docker /var/run/docker.sock
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
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:
quelle
Wenn jemand auf seinem lokalen Computer (Ubuntu) immer noch mit dem Problem konfrontiert ist, versuchen Sie es mit dem folgenden Befehl:
quelle
In meinem Fall wird dies erfolgreich funktionieren. Navigieren Sie in Ihrem lokalen Repo und geben Sie diesen Befehl ein.
quelle
Auf dem Server, auf dem Jenkins läuft, habe ich verwendet
Führen Sie dann jeden Docker-Container mit aus
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.
quelle
Verwenden Sie unten Docker-Datei
quelle
In meinem Fall wurde gerade der Docker-Dienst gestartet:
quelle
Oft muss ein Neustart durchgeführt werden, um die neue Benutzergruppe und den neuen Benutzer zu beeinflussen.
quelle
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:
quelle
Vielleicht sollten Sie den Docker von Anfang an mit der Option "-u root" ausführen
Zumindest hat das mein Problem gelöst
quelle
root
. Zumindest ist mir das mit Docker 18.06.1 passiert.