2014-12-30 14 views
114

Ho un contenitore di finestra mobile con alcuni processi (uwsgi e sedano) in esecuzione all'interno. Voglio creare un utente di sedici e un utente uwsgi per questi processi e un gruppo di lavoro a cui entrambi appartengano, al fine di assegnare le autorizzazioni.Aggiungi utente al contenitore mobile

Ho provato ad aggiungere RUN adduser uwsgi e RUN adduser celery al mio Dockerfile, ma questo sta causando problemi, dal momento che questi comandi richiedono l'input (ho postato le risposte dalla compilazione di seguito).

Qual è il modo migliore per aggiungere utenti a un contenitore Docker in modo da impostare le autorizzazioni per i lavoratori in esecuzione nel contenitore?

L'immagine di Docker è stata creata dalla base ufficiale di Ubuntu14.04.

Ecco l'output del Dockerfile quando i comandi vengono eseguiti adduser:

Adding user `uwsgi' ... 
Adding new group `uwsgi' (1000) ... 
Adding new user `uwsgi' (1000) with group `uwsgi' ... 
Creating home directory `/home/uwsgi' ... 
Copying files from `/etc/skel' ... 
[91mEnter new UNIX password: Retype new UNIX password: [0m 
[91mpasswd: Authentication token manipulation error 
passwd: password unchanged 
[0m 
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 563. 
[0m 
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 564. 
[0m 
Try again? [y/N] 
Changing the user information for uwsgi 
Enter the new value, or press ENTER for the default 
    Full Name []: 
Room Number []:  Work Phone []: Home Phone []: Other []: 
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 589. 
[0m 
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 590. 
[0m 
Is the information correct? [Y/n] 
---> 258f2f2f13df 
Removing intermediate container 59948863162a 
Step 5 : RUN adduser celery 
---> Running in be06f1e20f64 
Adding user `celery' ... 
Adding new group `celery' (1001) ... 
Adding new user `celery' (1001) with group `celery' ... 
Creating home directory `/home/celery' ... 
Copying files from `/etc/skel' ... 
[91mEnter new UNIX password: Retype new UNIX password: [0m 
[91mpasswd: Authentication token manipulation error 
passwd: password unchanged 
[0m 
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 563. 
[0m 
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 564. 
[0m 
Try again? [y/N] 
Changing the user information for celery 
Enter the new value, or press ENTER for the default 
    Full Name []: Room Number []:  Work Phone []: 
Home Phone []: Other []: 
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 589. 
[0m 
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 590. 
[0m 
Is the information correct? [Y/n] 

risposta

218

Il trucco è quello di utilizzare useradd invece del suo involucro interattiva adduser. Io di solito creare gli utenti con:

RUN useradd -ms /bin/bash newuser 

che crea una directory home per l'utente e assicura che bash è la shell di default.

È quindi possibile aggiungere:

USER newuser 
WORKDIR /home/newuser 

al vostro dockerfile. Ogni comando in seguito così come sessioni interattive saranno eseguiti come utente newuser:

docker run -t -i image 
[email protected]:~$ 

potrebbe essere necessario dare newuser le autorizzazioni per eseguire i programmi che si intende eseguire prima di invocare il comando utente.

L'utilizzo di utenti non privilegiati all'interno dei contenitori è una buona idea per motivi di sicurezza. Ha anche alcuni inconvenienti. Ancora più importante, le persone che derivano immagini dalla tua immagine dovranno tornare alla radice prima di poter eseguire comandi con i privilegi di superutente.

+0

è 'newuser' il nome dell'utente che tu stesso potrai scegliere? –

+0

Sì, esattamente. Sostituiscilo con un nome a tua scelta. –

+44

Ti consiglio di utilizzare le opzioni complete di nome in un Dockerfile, come in uno script, anziché in quelle brevi (più da utilizzare se usato in modo interattivo IMO). 'useradd --create-home --shell/bin/bash' è più comprensibile/leggibile per i colleghi. –

38

Per evitare le domande interattive di adduser, si può chiamare con questi parametri:

RUN adduser --disabled-password --gecos '' newuser 

Il parametro --gecos viene utilizzato per impostare le informazioni aggiuntive. In questo caso è solo vuoto.

Su sistemi con busybox (come alpino), utilizzare

RUN adduser -D -g '' newuser 

Vedi busybox adduser

+1

Grazie! Sembra che la soluzione di alto livello di 'adduser' sia generalmente preferibile all'utilizzo di funzioni di basso livello come' useradd'. – akhmed

+0

'adduser: opzione non riconosciuta: gecos' Questo non sembra funzionare su Alpine. – weberc2

1

aggiungere questa linea al vostro Dockerfile (È possibile eseguire qualsiasi comando di Linux in questo modo)

RUN useradd -ms /bin/bash yourNewUserName 
+7

un po 'più di spiegazione andrebbe bene ... – wmk

-3

Questo è ancora un altro esempio (nel caso in cui sia attiva una directory di rete)

(sudo groups || groups) | grep docker || echo 'Could not find docker group, consider: groupadd docker; gpasswd -a ${USER} docker; service docker.io restart; service docker restart; newgrp docker; nscd -i group' 

e solo creare l'utente con alcuni gruppi utili

useradd -g cdrom,floppy,audio,dip,video,plugdev,netdev,lpadmin,scanner,bluetooth,docker --create-home --shell $SHELL gitlabuser 
Problemi correlati