2015-08-24 10 views
8

Ich bin neu zu Docker, also, wenn dies ein ziemlich offensichtlicher Prozess ist, den ich vermisse, entschuldige ich mich für die dumme Frage im Voraus.Ändern der UID des Benutzers in einem Pre-Build-Docker-Container (Jenkins)

Ich richte einen Continuous Integration Server mit dem Docker-Image jenkins ein. Ich habe eine docker pull jenkins, und erstellt einen Benutzer jenkins, damit ich die /var/jenkins_home im Container zu meinem Host /var/jenkins_home (auch im Besitz von jenkins:jenkins Benutzer) mounten kann.

das Problem ist, dass der Behälter die jenkins Benutzer mit uid 102, aber mein Host hat die jenkins Benutzer als 1002 zu definieren scheint, so, wenn ich es laufen erhalte ich:

docker run --name jenkins -u jenkins -p 8080 -v /var/jenkins_home:/var/jenkins_home jenkins 
/usr/local/bin/jenkins.sh: line 25: /var/jenkins_home/copy_reference_file.log: Permission denied 

Ich würde einfach das machen UID für den Host jenkins Benutzer 102 in /etc/passwd, aber diese UID ist bereits von sshd genommen. Ich denke, die Lösung ist, den Behälter zu ändern, um uid 1002 stattdessen zu verwenden, aber ich bin nicht sicher, wie.

bearbeiten

Eigentlich Benutzer 102 auf dem Host messagebus ist, sshd nicht.

Antwort

3

Sie können einfach die UID in /etc/passwd ändern, vorausgesetzt, dass kein anderer Benutzer UID 1002.

hat, wird Sie dann das Eigentum an /var/jenkins_home auf Ihrem Host UID 1002 ändern müssen:

chown -R jenkins /var/jenkins_home 

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

chown -R 1002 /var/jenkins_home 

Dies funktioniert auch, wenn kein Benutzer mit UID 1002 lokal verfügbar ist.

Eine andere Lösung ist Ihr eigenes Docker Bild zu bauen, basierend auf dem Bild Jenkins, die eine ENTRYPOINT Skript hat, die wie etwas aussieht:

#!/bin/sh 
chown -R jenkins /var/jenkins_home 
exec "[email protected]" 

Dies wird (rekursiv) chown/var/jenkins_homeinnerhalb der Behälter Welche UID auch immer von dem Benutzer jenkins verwendet wird (dies setzt voraus, dass Ihr Docker enthält als root, was wahr ist, außer es gab eine USER Direktive in der Geschichte des Bildes).

aktualisieren

können Sie erstellen ein neue Bild, bezogen auf (FROM ...) der jenkins Bild mit einem Dockerfile, die die notwendigen Änderungen an der /etc/passwd Datei ausführt. Aber das scheint eine Menge Arbeit für wenig Gewinn zu sein. Es ist nicht klar, warum Sie den Benutzer jenkins auf dem Host erstellen oder ob Sie tatsächlich Zugriff auf das jenkins-Ausgangsverzeichnis auf dem Host benötigen.Wenn Sie nur Datenpersistenz bereitstellen, sollten Sie einen Datenvolumencontainer und --volumes-from anstatt eines Hostvolumes verwenden, da dies das Datenvolumen von Ihrem Host isoliert, sodass UID-Konflikte keine Verwirrung verursachen.

+0

Das Problem ist die UID, die das Bild verwendet, ist 102, die vom Host genommen wird. Wie kann ich die Benutzer-ID des Benutzers im Container ändern? – CodeChimp

2

Bitte werfen Sie einen Blick auf die Docker-Datei, die ich gerade hochgeladen habe: https://github.com/bdruemen/jenkins-docker-uid-from-volume/blob/master/Dockerfile. Hier wird die UID von einem eingehängten Volumen (Host-Verzeichnis) extrahiert, mit

stat -c '%u' <VOLUME-PATH> 

Dann wird die UID des Behälters Benutzer mit

auf den gleichen Wert geändert
usermod -u <UID> 

Dies wurde als getan werden Wurzel, aber dann sind root-Rechte fiel mit

gosu <USERNAME> <COMMAND> 

Alles im ENTRYPOINT getan wird, so die reale UID ist nicht bekannt, bis Sie

0 laufen
docker run -d -v <HOST-DIRECTORY>:<VOLUME-PATH> ... 

Beachten Sie, dass die UID nach dem Wechsel, könnte es in dem Behälter einige andere Dateien nicht mehr zugänglich für den Prozess sein, so dass Sie vielleicht ein

chown -R <USERNAME> <SOME-PATH> 

vor dem gosu Befehl benötigen.

Sie können auch die GID ändern, siehe meine Antwort hier Jenkins in docker with access to host docker und vielleicht möchten Sie beide ändern, um die Sicherheit zu erhöhen.

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.

+0

Anstatt SELinux zu deaktivieren, führen Sie docker mit der Option --privileged aus. ZB: docker run --name jenkins -d -p 8080: 8080 -p 50000: 50000 -v/home/jenkins:/var/jenkins_home -u 1001 --privileged jenkins – DevOops

Verwandte Themen