2014-07-03 8 views
35

Sto provando a passare utente all'utente tomcat7 per impostare i certificati SSH.Passaggio di utenti all'interno dell'immagine Docker a un utente non root

Quando faccio su tomcat7, non succede nulla.

whoami Ruturns ancora radice dopo aver fatto su tomcat7

Facendo un more /etc/passwd, ottengo il seguente risultato che dimostra chiaramente che l'utente tomcat7 esiste:

root:x:0:0:root:/root:/bin/bash 
daemon:x:1:1:daemon:/usr/sbin:/bin/sh 
bin:x:2:2:bin:/bin:/bin/sh 
sys:x:3:3:sys:/dev:/bin/sh 
sync:x:4:65534:sync:/bin:/bin/sync 
games:x:5:60:games:/usr/games:/bin/sh 
man:x:6:12:man:/var/cache/man:/bin/sh 
lp:x:7:7:lp:/var/spool/lpd:/bin/sh 
mail:x:8:8:mail:/var/mail:/bin/sh 
news:x:9:9:news:/var/spool/news:/bin/sh 
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh 
proxy:x:13:13:proxy:/bin:/bin/sh 
www-data:x:33:33:www-data:/var/www:/bin/sh 
backup:x:34:34:backup:/var/backups:/bin/sh 
list:x:38:38:Mailing List Manager:/var/list:/bin/sh 
irc:x:39:39:ircd:/var/run/ircd:/bin/sh 
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh 
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh 
libuuid:x:100:101::/var/lib/libuuid:/bin/sh 
messagebus:x:101:104::/var/run/dbus:/bin/false 
colord:x:102:105:colord colour management daemon,,,:/var/lib/colord:/bin/false 
saned:x:103:106::/home/saned:/bin/false 
tomcat7:x:104:107::/usr/share/tomcat7:/bin/false 

Quello che sto cercando di risolvere è questo errore di Hudson:

Command "git fetch -t [email protected]________.co.za:_______/_____________.git +refs/heads/*:refs/remotes/origin/*" returned status code 128: Host key verification failed. 

Questo è il mio Dockerfile, ci vuole una esistente Hudson file WAR un nd config che è tarrata e costruisce un'immagine, hudson gira bene, non può accedere a git a causa di certificati non esistenti per l'utente tomcat7.

FROM debian:wheezy 

# install java on image 
RUN apt-get update 
RUN apt-get install -y openjdk-7-jdk tomcat7 

# install hudson on image 
RUN rm -rf /var/lib/tomcat7/webapps/* 
ADD ./ROOT.tar.gz /var/lib/tomcat7/webapps/ 

# copy hudson config over to image 
RUN mkdir /usr/share/tomcat7/.hudson 
ADD ./dothudson.tar.gz /usr/share/tomcat7/ 
RUN chown -R tomcat7:tomcat7 /usr/share/tomcat7/ 

# add ssh certificates 
RUN mkdir /root/.ssh 
ADD ssh.tar.gz /root/ 

# install some dependencies 
RUN apt-get update 
RUN apt-get install --y maven 
RUN apt-get install --y git 
RUN apt-get install --y subversion 

# background script 
ADD run.sh /root/run.sh 
RUN chmod +x /root/run.sh 

# expose port 8080 
EXPOSE 8080 


CMD ["/root/run.sh"] 

sto utilizzando l'ultima versione di Docker (Docker la versione 1.0.0, costruire 63fe64c/1.0.0), è presente un bug nella finestra mobile o mi sto perdendo qualcosa nel mio Dockerfile?

+1

Are sei a conoscenza dell'istruzione ['USER'] (http://docs.docker.com/reference/builder/#user) Dockerfile? – icecrime

+1

No, cosa suggerisci di usarlo? –

+0

Sarebbe possibile generare certificati tramite il Dockerfile usando l'istruzione USER? –

risposta

46

Non utilizzare su in un file di dati, tuttavia è necessario utilizzare l'istruzione USER nel file Docker.

In ogni fase della build Dockerfile, viene creato un nuovo contenitore in modo che le modifiche apportate all'utente non persistano nella fase di costruzione successiva.

Ad esempio:

RUN whoami 
RUN su test 
RUN whoami 

Questo non sarebbe mai dire che l'utente sarebbe test come un nuovo contenitore viene generato al 2 ° whoami. L'output dovrebbe essere root su entrambi (a meno che, naturalmente, non venga eseguito in precedenza USER).

Se invece lo fai:

RUN whoami 
USER test 
RUN whoami 

Si dovrebbe vedere root poi test.

In alternativa è possibile eseguire un comando come un altro utente con sudo con qualcosa di simile

sudo -u test whoami 

Ma sembra meglio usare il funzionario ha sostenuto istruzioni.

+3

Funziona, USER sembra essere la strada giusta da percorrere. –

+0

Sono curioso di sapere come assicurarsi che i comandi di esecuzione precedenti siano disponibili per l'utente impostato nel Dockerfile. [Ho una domanda] (http://stackoverflow.com/questions/36183585/how-can-one-influence-the-order-of-run-commands-in-a-dockerfile) dove cartelle e permessi precedentemente impostati da root non sono disponibili dopo il passaggio a un altro utente con l'istruzione 'USER'. –

-6

Non c'è un modo reale per farlo. Di conseguenza, cose come mysqld_safe falliscono e non è possibile installare mysql-server in un contenitore di una finestra mobile di Debian senza saltare attraverso 40 cerchi perché ... beh ... si interrompe se non è root.

È possibile utilizzare USER, ma non sarà possibile apt-get install se non si è root.

+5

Quindi cambia utente dopo –

10

Come approccio diverso all'altra risposta, invece di indicare all'utente la creazione dell'immagine sul Dockerfile, è possibile farlo tramite la riga di comando su un particolare contenitore come base per comando.

Con docker exec, utilizzare --user per specificare quale account utente terminale interattivo userà (il contenitore dovrebbe essere in esecuzione e l'utente deve esistere nel sistema in container):

docker exec -it --user [username] [container] bash 

Vedi https://docs.docker.com/engine/reference/commandline/exec/

Problemi correlati