2016-03-23 29 views
14

Voglio eseguire un'istanza Jenkins in un contenitore finestra mobile.Come montare il connettore docker come volume nel contenitore docker con il gruppo corretto

voglio Jenkins stesso di essere in grado di girare su contenitori docker come schiavi per eseguire i test in.

Sembra che il modo migliore per farlo è quello di utilizzare

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

source

Il Dockerfile che sto usando è

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 && apt-get install -y docker.io 
RUN usermod -aG docker jenkins 
USER jenkins 

Se inizio una sessione di bash nel mio container esecuzione e correre docker info sulla mia immagine ho

$ 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? 

E se corro la sessione bash come root

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

Quindi credo che la docker gruppo I' m aggiungendo l'utente jenkins è il gruppo per la finestra mobile interna, quindi il socket non è leggibile senza sudo. Questo è un tipo di problema in quanto il plugin docker di jenkins, ecc., Non è impostato per usare sudo.

Come posso montare il socket in modo che possa essere utilizzato dall'immagine senza sudo?

+0

Hai trovato una soluzione per il tuo problema? Sto affrontando lo stesso problema adesso –

risposta

5

Ho usato il vostro dockerfile, ma ha fatto una piccola modifica:

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 

Dopo aver costruito l'immagine posso cominciare usando (io sono su centos7):

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 

Si è tentato di installare il pacchetto docker.io all'interno dell'immagine. Ma questo pacchetto è anche sul tuo host (altrimenti non è possibile eseguire contenitori docker su di esso). Quindi si consiglia di montarlo sul tuo contenitore invece di installarlo nel tuo file docker. penso che il montato/lib64/... è specifico per CentOS 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

Ho la stessa domanda dell'OP, ho trovato utile questo post (anche se non risolve il problema dei permessi). http://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/ L'autore sconsiglia di montare il file binario docker dall'host al contenitore: " Questo non è più affidabile, perché il Docker Engine non è più distribuito come (quasi) librerie statiche. ". – ldirer

+0

È passato un po 'di tempo a dare un'occhiata. Cosa vuoi dire che non è più affidabile? Ho appena avviato un container e montato il .sock e bin e posso utilizzare la finestra mobile (1.12) o ho sbagliato? Grazie – lvthillo

+0

Onestamente non sono abbastanza esperto per darti una risposta adeguata, volevo solo far notare che il link che ho postato lo sconsiglia. – ldirer

8

Un po 'in ritardo, ma questo potrebbe aiutare altri utenti che stanno lottando con lo stesso problema:

Il problema qui è che il gruppo docker sull'host di docker abbia un ID di gruppo diverso dall'ID del gruppo docker all'interno del contenitore. Dal momento che il demone si preoccupa solo dell'ID e non del nome del gruppo, la tua soluzione funzionerà solo se la coincidenza di questo ID avviene per caso.

Il modo per risolvere questo problema è utilizzare tcp anziché utilizzare un socket unix utilizzando -H option all'avvio del motore Docker. Dovresti essere molto attento con questo, in quanto ciò consente a chiunque abbia accesso a questa porta di ottenere l'accesso come root al tuo sistema.

Un modo più sicuro per risolvere questo problema è assicurarsi che il gruppo docker all'interno del contenitore abbia lo stesso ID di gruppo del gruppo docker all'esterno del contenitore.È possibile farlo utilizzando costruire argomenti per il vostro docker build:

Dockerfile:

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 

E poi costruirlo usando

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

Dopo questo è possibile eseguire la vostra immagine e avere accesso finestra mobile come non root

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

Perché questa soluzione dipende dalla fornitura g l'id di gruppo corretto per il daemon docker quando l'immagine è in fase di costruzione, questa immagine dovrebbe essere costruita sulla macchina (s) in cui viene utilizzata. Se costruisci l'immagine, spingila e qualcun altro la carica sulla loro macchina, è probabile che gli ID di gruppo non corrispondano di nuovo.

+1

Assicurarsi che l'ID del gruppo 'docker' fosse coerente nell'host e all'interno del contenitore fosse esattamente quello che dovevamo risolvere quando si trovava di fronte allo stesso problema. Grazie! – advancingu

Problemi correlati