Ändern der Benutzer-UID in einem Container vor dem Build-Docker (jenkins)

8

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:

%Vor%

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.

    
CodeChimp 24.08.2015, 14:16
quelle

3 Antworten

3

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:

%Vor%

Tatsächlich brauchen Sie nicht einen jenkins Benutzer auf dem Host, um dies zu tun; Sie können einfach ausführen:

%Vor%

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:

%Vor%

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.

    
larsks 24.08.2015 15:45
quelle
2

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.

    
bdruemen 05.10.2015 12:36
quelle
0

Ich hatte den gleichen Fehler, ich habe SELinux ausgeschaltet (auf CEntOS) und es funktioniert. Sonst wäre es besser, SElinux mit SEManage-Befehlen abzustimmen.

    
Benoit_tt 23.11.2015 13:56
quelle

Tags und Links