2015-08-24 8 views
8

Sono nuovo nella finestra mobile, quindi se questo è un processo abbastanza ovvio che mi manca, mi scuso per la domanda stupida in anticipo.Cambiare l'uid dell'utente in un contenitore di finestra mobile pre-generazione (jenkins)

Sto configurando un server di integrazione continuo utilizzando l'immagine del docker jenkins. Ho creato uno jenkins e ho creato un utente jenkins per consentirmi di montare lo /var/jenkins_home nel contenitore su /var/jenkins_home del mio ospite (anch'esso di proprietà dell'utente jenkins:jenkins).

il problema è che il contenitore sembra definire l'utente jenkins con UID 102, ma il mio ospite ha l'utente jenkins come 1002, in modo che quando l'eseguo ottengo:

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 

Vorrei semplicemente fare la uid per l'utente jenkins dell'host è 102 in /etc/passwd, ma quell'uid è già stato preso da sshd. Penso che la soluzione sia cambiare il contenitore per usare invece l'uid 1002, ma non so come.

Modifica

In realtà, l'utente 102 sull'host è messagebus, non SSHD.

risposta

3

si può semplicemente cambiare l'UID in /etc/passwd, partendo dal presupposto che nessun altro utente ha UID 1002.

Sarà quindi necessario modificare la proprietà della /var/jenkins_home sul vostro ospite a UID 1002:

chown -R jenkins /var/jenkins_home 

In effetti, non è nemmeno necessario che un utente jenkins per l'utilizzi l'host per farlo; è possibile eseguire semplicemente:

chown -R 1002 /var/jenkins_home 

Questo funzionerà anche se non c'è un utente con UID 1002 disponibile localmente.

Un'altra soluzione è quella di costruire la vostra immagine finestra mobile proprio, basato l'immagine Jenkins, che ha uno script ENTRYPOINT che assomiglia a:

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

Questo sarà (ricorsivamente) chown/var/jenkins_homeall'interno il contenitore per qualunque sia l'UID utilizzato dall'utente jenkins (questo presuppone che il Docker contenga inizia come root, che è vero a meno che non ci fosse una direttiva USER nella cronologia dell'immagine).

Aggiornamento

È possibile creare una nuova immagine un , basato (FROM ...) l'immagine del Jenkins, con un Dockerfile che esegue le modifiche necessarie al file /etc/passwd su. Ma sembra molto lavoro per non guadagnare molto. Non è chiaro il motivo per cui stai creando l'utente jenkins sull'host o se effettivamente hai bisogno di accedere alla directory home di jenkins sull'host.

Se tutto quello che stai facendo sta fornendo la persistenza dei dati, è consigliabile utilizzare un contenitore di volume dei dati e --volumes-from piuttosto che un volume host, perché questo sarà isolare il volume di dati dal vostro host in modo che i conflitti UID non causano confusione.

+0

Il problema è che l'uid utilizzato dall'immagine è 102, che viene preso dall'host. Come posso cambiare l'UID dell'utente all'interno del contenitore? – CodeChimp

2

Si prega di dare un'occhiata al file di finestra mobile che ho appena caricato: https://github.com/bdruemen/jenkins-docker-uid-from-volume/blob/master/Dockerfile. Qui l'UID è estratto da un volume montato (directory host), con

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

Poi l'UID dell'utente contenitore viene modificata allo stesso valore con

usermod -u <UID> 

Ciò deve essere fatto come radice, ma poi i privilegi di root vengono eliminati con

gosu <USERNAME> <COMMAND> 

Tutto è fatto nella entrypoint, in modo che il vero e proprio UID è sconosciuta fino a quando si esegue

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

Si noti che dopo aver cambiato l'UID, ci potrebbero essere alcuni altri file non sono più accessibili per il processo nel contenitore, quindi potrebbe essere necessario un

chown -R <USERNAME> <SOME-PATH> 

prima del comando Gosu.

È inoltre possibile modificare il GID, vedere la mia risposta qui Jenkins in docker with access to host docker e forse si desidera modificare entrambi per aumentare la sicurezza.

0

Ho avuto lo stesso errore, ho spento SELinux (su CEntOS) e funziona. Altrimenti, sarebbe meglio sintonizzare SElinux con i comandi SEManage.

+0

Invece di spegnere SELinux, eseguire la finestra mobile con l'opzione --privileged. Es .: esecuzione docker --name jenkins -d -p 8080: 8080 -p 50000: 50000 -v/home/jenkins:/var/jenkins_home -u 1001 - jenkins privilegiati – DevOops

Problemi correlati