Ich bin neu für Docker, also, wenn dies ein ziemlich offensichtlicher Prozess ist, den ich vermisse, entschuldige ich mich für die dumme Frage von vorne.
Ich richte einen Continuous Integration Server mit dem Docker-Image jenkins
ein. Ich habe ein docker pull jenkins
erstellt und einen Benutzer jenkins
erstellt, um mir das /var/jenkins_home
im Container auf das /var/jenkins_home
meines Hosts (auch im Besitz von jenkins:jenkins
user) zu mounten.
Das Problem ist, dass der Container den jenkins
-Benutzer mit der Benutzer-ID 102 definiert, aber mein Host hat den jenkins
-Benutzer als 1002. Wenn ich es also ausführe, bekomme ich:
Ich würde einfach die UID für den jenkins
-Benutzer des Hosts auf 102 in /etc/passwd
setzen, aber diese UID wird bereits von sshd übernommen. Ich denke, die Lösung ist, den Behälter zu ändern, um stattdessen uid 1002 zu benutzen, aber ich bin nicht sicher, wie.
Bearbeiten
Tatsächlich ist der Benutzer 102 auf dem Host Nachrichtenbus, nicht sshd.
Sie können die UID einfach in /etc/passwd
ändern, vorausgesetzt, dass kein anderer Benutzer die UID 1002 hat.
Sie müssen dann den Besitz von /var/jenkins_home
auf Ihrem Host in UID 1002 ändern:
Tatsächlich brauchen Sie nicht einen jenkins
Benutzer auf dem Host, um dies zu tun; Sie können einfach ausführen:
Dies funktioniert auch dann, wenn kein Benutzer mit UID 1002 lokal verfügbar ist.
Eine andere Lösung besteht darin, basierend auf dem Jenkins-Bild ein eigenes Docker-Bild zu erstellen, das ein ENTRYPOINT
-Skript enthält, das etwa wie folgt aussieht:
Dies wird (rekursiv) chown
/var/jenkins_home
innerhalb des Containers zu der UID, die vom jenkins
Benutzer verwendet wird (vorausgesetzt, dass Ihr Docker enthält, beginnt als root
, was ist wahr, es sei denn, es gab eine USER
-Direktive in der Geschichte des Bildes).
Aktualisieren
Sie können ein neues Bild basierend auf ( FROM ...
) dem jenkins-Bild mit einer Docker-Datei erstellen, die die notwendigen Änderungen an der /etc/passwd
-Datei vornimmt. Aber das scheint eine Menge Arbeit für wenig Gewinn zu sein. Es ist nicht klar, warum Sie jenkins
user auf dem Host erstellen oder ob Sie tatsächlich Zugriff auf das jenkins-Home-Verzeichnis auf dem Host benötigen.
Wenn Sie lediglich Datenpersistenz bereitstellen, sollten Sie einen Datenvolumencontainer und --volumes-from
anstelle eines Hostvolumes verwenden, da dies das Datenvolumen von Ihrem Host isoliert, so dass UID-Konflikte keine Verwirrung verursachen.
Bitte werfen Sie einen Blick auf die Docker-Datei, die ich gerade hochgeladen habe: Ссылка . Hier wird die UID aus einem gemounteten Volume (Host-Verzeichnis) mit
extrahiert %Vor%Dann wird die UID des Containerbenutzers mit
auf denselben Wert gesetzt %Vor%Dies muss als root ausgeführt werden, aber root-Privilegien werden mit
verworfen %Vor%Alles wird im ENTRYPOINT erledigt, daher ist die echte UID unbekannt, bis Sie
ausführen %Vor%Beachten Sie, dass nach dem Ändern der UID möglicherweise weitere Dateien für den Prozess im Container nicht mehr zugänglich sind. Daher benötigen Sie möglicherweise ein
%Vor%vor dem Befehl gosu.
Sie können auch die GID ändern, siehe meine Antwort hier Jenkins in Docker mit Zugriff auf Host Docker und vielleicht möchtest du beides ändern, um die Sicherheit zu erhöhen.
Tags und Links jenkins docker jenkins-docker