Come aggiungere utenti al contenitore Docker?


286

Ho un container docker con alcuni processi (uwsgi e sedano) in esecuzione all'interno. Voglio creare un utente di sedano e un utente uwsgi per questi processi, nonché un gruppo di lavoro a cui apparterranno entrambi, al fine di assegnare le autorizzazioni.

Ho provato ad aggiungere RUN adduser uwsgie RUN adduser celeryal mio Dockerfile, ma questo sta causando problemi, poiché questi comandi richiedono input (ho pubblicato le risposte dalla build seguente).

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

La mia immagine Docker è costruita dalla base ufficiale Ubuntu14.04.

Ecco l'output dal Dockerfile quando vengono eseguiti i comandi 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] 

Risposte:


489

Il trucco è usare al useraddposto del suo wrapper interattivo adduser. Di solito creo utenti con:

RUN useradd -ms /bin/bash newuser

che crea una home directory per l'utente e garantisce che bash sia la shell predefinita.

È quindi possibile aggiungere:

USER newuser
WORKDIR /home/newuser

nel tuo file docker. Ogni comando successivo e sessioni interattive verranno eseguiti come utente newuser:

docker run -t -i image
newuser@131b7ad86360:~$

Potrebbe essere necessario concedere newuserle autorizzazioni per eseguire i programmi che si intende eseguire prima di invocare il comando utente.

L'uso di utenti non privilegiati all'interno dei container è 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 privilegi di superutente.


143
Consiglierei di usare le opzioni del nome completo in un file Docker, come in uno script, anziché in quelle brevi (più da usare se usato in modo interattivo IMO). useradd --create-home --shell /bin/bashè più comprensibile / leggibile per i colleghi.
Baptiste Mathus,

25
Per impostare la password puoi usare chpasswd come:RUN echo 'newuser:newpassword' | chpasswd
iuridiniz

3
Si noti che se si sta creando un nuovo utente con un ID utente di grandi dimensioni, la finestra mobile potrebbe bloccarsi / arrestarsi durante il tentativo di creare lastlog - un file sparso enorme. Evita questo con l' --no-log-initopzione di useradd.
DavidAug

10
Bel consiglio, @iuridiniz! Non dimenticare di chiamarlo prima USER newuser. Se hai anche bisogno che l'utente abbia i privilegi di root, puoi anche includere adduser <username> sudo.
Yamaneko,

6
/bin/sh: useradd: not foundalpine linux
deathangel908

92

Per evitare le domande interattive di adduser, puoi chiamarlo con questi parametri:

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

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

Sui sistemi con busybox (come Alpine), utilizzare

RUN adduser -D -g '' newuser

Vedi adduser busybox


3
Grazie! Sembra che la addusersoluzione di alto livello sia generalmente preferita all'uso di funzioni di basso livello come useradd.
akhmed,

adduser: unrecognized option: gecosQuesto non sembra funzionare su Alpine.
weberc2,

cosa fa la password disabilitata e come possiamo impostare la password per l'utente contemporaneamente nel Dockerfile?
Hossein,

72

Ubuntu

Prova le seguenti righe in Dockerfile:

RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G sudo -u 1001 ubuntu
USER ubuntu
WORKDIR /home/ubuntu

useraddopzioni (vedi:) man useradd:

Impostazione della password dell'utente predefinito

Per impostare la password dell'utente, aggiungere -p "$(openssl passwd -1 ubuntu)"al useraddcomando.

In alternativa aggiungi le seguenti righe al tuo Dockerfile:

SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN echo 'ubuntu:ubuntu' | chpasswd

La prima istruzione shell è assicurarsi che l' -o pipefailopzione sia abilitata prima RUNcon una pipe al suo interno. Per saperne di più: Hadolint: sfilacciare il file Docker .


2
Perché l'utente dovrebbe essere nel gruppo radice? Il punto non è quello di avere un utente non root per motivi di sicurezza
Novaterata

5
@Novaterata A seconda dell'uso. rootgruppo non indica che hanno accesso come root, ma hanno solo un accesso in lettura ad alcuni file (come i log), il che è utile, ma dipende dal progetto.
Kenorb,

Vedo che funziona, sono automaticamente loggato come utente, ma sto ancora generando file di proprietà di root. Ho anche usato solo "utente USER" poiché il mio nome utente per l'utente locale e il gruppo è "utente". Genera ancora file di proprietà root. C'è qualcos'altro che dovrei fare? Fondamentalmente sto creando un contenitore docker che compila la nostra base di codice. Quindi controlla il codice da svn, imposta le variabili usando bash source. I comandi bash potrebbero fare le cose come root anche se non mi viene mai richiesta la password di root?
JoeManiaci,

14

L'aggiunta di un utente nella finestra mobile e l'esecuzione dell'app in tale utente è un'ottima pratica dal punto di vista della sicurezza. Per fare ciò, consiglierei di seguito i passaggi:

FROM node:10-alpine

# Copy source to container
RUN mkdir -p /usr/app/src

# Copy source code
COPY src /usr/app/src
COPY package.json /usr/app
COPY package-lock.json /usr/app

WORKDIR /usr/app

# Running npm install for production purpose will not run dev dependencies.
RUN npm install -only=production    

# Create a user group 'xyzgroup'
RUN addgroup -S xyzgroup

# Create a user 'appuser' under 'xyzgroup'
RUN adduser -S -D -h /usr/app/src appuser xyzgroup

# Chown all the files to the app user.
RUN chown -R appuser:xyzgroup /usr/app

# Switch to 'appuser'
USER appuser

# Open the mapped port
EXPOSE 3000

# Start the process
CMD ["npm", "start"]

I passaggi precedenti sono un esempio completo della copia dei file di progetto NodeJS, della creazione di un gruppo utenti e dell'utente, dell'assegnazione delle autorizzazioni all'utente per la cartella del progetto, del passaggio all'utente appena creato e dell'esecuzione dell'app sotto tale utente.


1
addgroup non riuscito per me, passaggio 15/11: ESEGUI addgroup -S username ---> In esecuzione in db9fd22d469d L'opzione s è ambigua (shell, sistema) adduser [--home DIR] [--shell SHELL] [--no-create -home] [--uid ID] [--firstuid ID] [--lastuid ID] [--gecos GECOS] [--ingroup GROUP | --gid ID] [--disabled-password] [--disabled-login] [--encrypt-home] UTENTE Aggiungi un utente normale
teoring

9

Puoi imitare Dockerfile open source, ad esempio:

Nodo: node12-github

RUN groupadd --gid 1000 node \
    && useradd --uid 1000 --gid node --shell /bin/bash --create-home node

superset: superset-github

RUN useradd --user-group --create-home --no-log-init --shell /bin/bash 
    superset

Penso che sia un buon modo per seguire l'open source.


3

Ognuno ha il suo preferito personale, e questo è il mio:

RUN useradd --user-group --system --create-home --no-log-init app
USER app

Riferimento: man useradd

La RUNriga aggiungerà l'utente e il gruppo app:

root@ef3e54b60048:/# id app
uid=999(app) gid=999(app) groups=999(app)

Utilizzare un nome più specifico rispetto a appse l'immagine deve essere riutilizzata come immagine di base. A parte, includi --shell /bin/bashse ne hai davvero bisogno.


Credito parziale: risposta di Ryan M


1

In alternativa puoi fare così.

RUN addgroup demo && adduser -DH -G demo demo

Il primo comando crea un gruppo chiamato demo . Il secondo comando crea l' utente demo e lo aggiunge al gruppo demo creato in precedenza .

Bandiere sta per:

-G Group
-D Don't assign password
-H Don't create home directory

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.