2016-03-23 5 views
14

Ich möchte eine Jenkins-Instanz in einem Andock-Container ausführen.So mounten Sie den Docker-Socket als Volume im Docker-Container mit der korrekten Gruppe

Ich möchte Jenkins selbst in der Lage sein Docker-Container als Sklaven zu drehen bis laufen Tests in.

Es scheint der beste Weg, dies zu tun ist

docker run -v /var/run.docker.sock:/var/run/docker.sock -p 8080:8080 -ti my-jenkins-image 

source

zu verwenden Die Dockerfile Ich verwende ist

Wenn ich ein Bash-Sitzung in meinem Laufbehälter und laufen docker info auf meinem Bild starten bekomme ich

$ docker info 
FATA[0000] Get http:///var/run/docker.sock/v1.18/info: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS? 

Und wenn ich die Bash-Sitzung als root

docker exec -u 0 -ti cocky_mccarthy bash 
[email protected]:/# docker info 
Containers: 42 
Images: 50 
... 

Also ich denke, die docker Gruppe I‘laufen Das Hinzufügen des Jenkins-Benutzers zu der Gruppe für das interne Andockfenster, daher ist der Socket ohne Sudo nicht lesbar. Das ist ein Problem, da das jenkins docker plugin usw. nicht für die Verwendung von sudo eingerichtet ist.

Wie kann ich den Sockel montieren, damit er aus dem Bild ohne Sudo verwendet werden kann?

+0

Haben Sie eine Lösung für Ihr Problem gefunden? Ich habe das gleiche Problem im Moment –

Antwort

5

habe ich Ihre dockerfile aber tat einen kleinen edit:

FROM jenkins 
COPY plugins.txt /usr/share/jenkins/plugins.txt 
RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt 

USER root 
RUN apt-get update 
RUN groupadd docker && gpasswd -a jenkins docker 
USER jenkins 

Nachdem das Bild Gebäude Ich kann es benutzen (ich auf centos7 bin):

docker run -d \ 
-v /var/run/docker.sock:/var/run/docker.sock \ 
    -v $(which docker):/usr/bin/docker:ro \ 
    -v /lib64/libdevmapper.so.1.02:/usr/lib/x86_64-linux-gnu/libdevmapper.so.1.02 \ 
    -v /lib64/libudev.so.0:/usr/lib/x86_64-linux-gnu/libudev.so.0 \ 
    -p 8080:8080 \ 
    --name jenkins \ 
    --privileged=true -t -i \ 
test/jenkins 

Sie haben versucht, zu installieren das Paket docker.io in Ihrem Bild. Dieses Paket befindet sich jedoch auch auf Ihrem Host (andernfalls können keine Docker-Container ausgeführt werden). Es wird daher empfohlen, dies an Ihren Container anzuhängen, anstatt es in Ihrer Docker-Datei zu installieren. ich denke, die montiert/lib64/... für Centos spezifisch ist 7.

$ docker exec -it 9fc27d5fcec1 bash 
[email protected]:/$ whoami 
jenkins 
[email protected]:/$ docker ps 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS        NAMES 
9fc27d5fcec1  test    "/bin/tini -- /usr/lo" 6 minutes ago  Up 6 minutes  0.0.0.0:8080->8080/tcp, 50000/tcp jenkins 
+2

Ich habe die gleiche Frage wie das OP, fand ich diesen Beitrag hilfreich sein (obwohl es nicht die Berechtigungen Problem lösen). http://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/ Der Autor rät davon ab, die Docker-Binärdatei vom Host auf den Container zu kopieren: " Dies ist nicht mehr zuverlässig, da die Docker Engine nicht mehr als (fast) statische Bibliotheken vertrieben wird. ". – ldirer

+0

Vor einiger Zeit habe ich es mir angesehen. Was meinst du damit, dass das nicht mehr zuverlässig ist? Ich habe gerade einen Container gestartet und die .sock und bin montiert und ich kann Docker darin verwenden (1.12) oder liege ich falsch? Danke – lvthillo

+0

Ehrlich gesagt bin ich nicht sachkundig genug, um Ihnen eine richtige Antwort zu geben, ich wollte nur darauf hinweisen, dass der Link, den ich geschrieben habe, davon abrät. – ldirer

8

Ein bisschen spät, aber dies könnte andere Benutzer helfen, die mit dem gleichen Problem zu kämpfen hat:

Das Problem hier ist, dass die docker Gruppe auf Ihrem Docker-Host eine andere Gruppen-ID als die ID der docker Gruppe in Ihrem Container hat. Da sich der Daemon nur um die ID und nicht um den Namen der Gruppe kümmert, funktioniert Ihre Lösung nur, wenn diese IDs zufällig zusammenpassen.

Der Weg, um dies zu lösen, ist entweder mit TCP statt mit einem Unix-Socket mit dem -H option beim Start Docker-Engine. Sie sollten sehr vorsichtig mit diesem sein, da dies ermöglicht jedem, der Zugriff auf diesen Port hat, Root-Zugriff auf Ihr System zu erhalten.

Eine sicherere Art, dies zu beheben, ist sicherzustellen, dass die docker Gruppe innerhalb des Containers die gleiche Gruppen-ID wie die docker Gruppe außerhalb des Containers hat.

Dockerfile: Sie können für Ihre docker build dies mit tun Argumente bauen

FROM jenkinsci 
ARG DOCKER_GROUP_ID 

USER root 
RUN curl -o /root/docker.tgz https://get.docker.com/builds/Linux/x86_64/docker-1.12.5.tgz && tar -C /root -xvf /root/docker.tgz && mv /root/docker/docker /usr/local/bin/docker && rm -rf /root/docker* 
RUN curl -L https://github.com/docker/compose/releases/download/1.7.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose 
RUN groupadd -g $DOCKER_GROUP_ID docker && gpasswd -a jenkins docker 
USER jenkins 

Und dann bauen

docker build --build-arg DOCKER_GROUP_ID=`getent group docker | cut -d: -f3` -t my-jenkins-image . 

Danach verwenden, können Sie Ihr Bild laufen und Docker Zugriff als nicht haben Wurzel

docker run -v /var/run/docker.sock:/var/run/docker.sock -p 8080:8080 -ti my-jenkins-image 

Weil diese Lösung auf Lieferung angewiesen ist Wenn beim Erstellen des Image die richtige Gruppen-ID für den Docker-Daemon verwendet wird, muss dieses Image auf den Computern erstellt werden, auf denen es verwendet wird. Wenn Sie das Bild erstellen, drücken Sie es und jemand anderes zieht es auf ihre Maschine, die Gruppen-IDs sind wahrscheinlich nicht wieder übereinstimmen.

+1

Sicherstellen, dass die Docker-Gruppen-ID auf dem Host und innerhalb des Containers konsistent war, war genau das, was wir beheben mussten, um das gleiche Problem zu beheben. Vielen Dank! – advancingu

Verwandte Themen