2017-02-10 5 views
12

Ich habe ein Andockfenster in Docker Setup für CI. Im Wesentlichen verfügt der Computer über einen CI-Server von jenkins, der denselben Socket-Socket für Computer verwendet, um Knoten für CI zu erstellen.Docker in Docker Berechtigungen Fehler

Das funktionierte gut, bis ich kürzlich Docker aktualisiert. Ich habe das Problem erkannt, aber ich kann die richtige Magie nicht finden, um es zum Laufen zu bringen.

host $ docker exec -it myjenkins bash 
[email protected] $ docker ps 
Got permission denied while trying to connect to the Docker daemon 
socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.26/containers/json: dial unix /var/run/docker.sock: connect: permission denied 

host $ docker exec -it -u root -it myjenkins bash 
[email protected] $ docker ps 
... docker ps from host container yay! ... 

Also hier ist was ich vermute. Ich habe Zugriff auf den Host-Docker-Socket innerhalb des Containers, aber ich kann anscheinend keine Erlaubnis für den Benutzer jenkins geben.

Ich habe die Docker-Gruppe hinzugefügt und auch die Dinker-Gruppe um den Benutzer jenkins erweitert. Aber ich bekomme immer noch den gleichen Fehler. Ich habe einen Schlag von Zeiten neu gestartet, also bin ich irgendwie ratlos, was ich als nächstes tun soll.

Gibt es eine Möglichkeit, Berechtigungen für einen Benutzer auf einem bestimmten Socket zu erzwingen?

+0

Nur aus Neugier, haben Sie versucht, das Gleiche mit einem privilegierten Behälter (als root innen)? –

+0

Wenn Sie auf meine Frage schauen, wo ich Konsole präsentiere. Ich habe gezeigt, dass ich als Benutzer jenkins versuchte, und dann wieder als root-Benutzer des Containers. Der Benutzer root hat Zugriff, der Benutzer jenkins nicht. –

+0

Nur aus Neugierde, hast du das Gleiche mit einem * privilegierten * Container versucht (wie Jinkins drin) –

Antwort

13

Sie müssen die GID der Docker-Gruppe auf Ihrem Host dem GID einer Gruppe zuordnen, zu der jenkins in Ihrem Container gehört. Hier ist ein Beispiel aus meinem Dockerfile, wie ich ein jenkins Slave Bild aufgebaut haben:

ARG DOCKER_GID=993 

RUN groupadd -g ${DOCKER_GID} docker \ 
    && curl -sSL https://get.docker.com/ | sh \ 
    && apt-get -q autoremove \ 
    && apt-get -q clean -y \ 
    && rm -rf /var/lib/apt/lists/* /var/cache/apt/*.bin 

RUN useradd -m -d /home/jenkins -s /bin/sh jenkins \ 
    && usermod -aG docker jenkins 

Die 993 geschieht in diesem Beispiel die gid von Docker auf dem Host zu sein, würden Sie, dass passen Sie Ihre Umgebung anzupassen.


Lösung aus dem OP: Wenn Wiederaufbau nicht eine Möglichkeit ist, dass Sie die Docker Gruppe entsprechend in mit root einstellen können und den Benutzer hinzuzufügen. Wenn Sie dies versuchen, bevor können Sie die Gruppe auf dem Slave löschen (groupdel docker):

docker exec -it -u root myjenkins bash 
container $ groupadd -g 993 docker 
container $ usermod -aG docker jenkins 
+0

OK. Aha. Auf dem Host-Docker ist 999. In der Slave-Docker ist 1001. Also was Sie sagen, ist, dass ich sicherstellen muss, dass GID auf Slave ist gleich wie Host? Glaubst du, ich komme einfach mit der Bearbeitung von '/ etc/group' durch? –

+1

Das GID in der docker.sock-Datei muss auch ein GID des Benutzers innerhalb des Containers sein. Sie können mit dieser ID eine beliebige Gruppe innerhalb des Bildes erstellen und Jenkins zu dieser Gruppe hinzufügen. Das Ändern der/etc/-Gruppe auf dem Host funktioniert nicht, ohne auch die Berechtigungen für die Dateien zu ändern. – BMitch

+1

Ausgezeichnet ausgezeichnet ausgezeichnet. Ich werde deine Antwort mit meinem Update aktualisieren. –

0

Führen Sie den Befehl mit Root-Benutzern von sudo im Start einschließlich.

0

Persönlich habe ich gerade hat, dies zu tun:

sudo gpasswd -a $USER docker 

Und es hat geklappt