Il trucco è usare useradd
invece 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 assicura che bash sia la shell predefinita.
Puoi quindi aggiungere:
USER newuser
WORKDIR /home/newuser
al tuo dockerfile. Ogni comando successivo così come le sessioni interattive verranno eseguite come utente newuser
:
docker run -t -i image
[email protected]:~$
Potrebbe essere necessario fornire newuser
i permessi per eseguire i programmi che intendi eseguire prima di invocare il comando utente.
L'utilizzo di utenti senza privilegi all'interno dei contenitori è una buona idea per motivi di sicurezza. Ha anche alcuni inconvenienti. Ancora più importante, le persone che traggono immagini dalla tua immagine dovranno tornare a root prima di poter eseguire comandi con privilegi di superutente.
L'aggiunta di un utente nella finestra mobile e l'esecuzione dell'app con quell'utente è un'ottima pratica dal punto di vista della sicurezza. Per fare ciò, consiglierei i seguenti 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 di utenti e di un utente, dell'assegnazione delle autorizzazioni all'utente per la cartella del progetto, del passaggio all'utente appena creato e dell'esecuzione dell'app con quell'utente.
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
useradd
opzioni (vedi:man useradd
):
-r
,--system
Crea un account di sistema.-m
,--create-home
Crea la home directory dell'utente.-d
,--home-dir HOME_DIR
Home directory del nuovo account.-s
,--shell SHELL
Shell di login del nuovo account.-g
,--gid GROUP
Nome o ID del gruppo principale.-G
,--groups GROUPS
Elenco dei gruppi supplementari.-u
,--uid UID
Specifica l'ID utente.-p
,--password PASSWORD
Password crittografata del nuovo account (ad es.ubuntu
).
Impostazione della password utente predefinita
Per impostare la password utente, aggiungi -p "$(openssl passwd -1 ubuntu)"
a useradd
comando.
In alternativa, aggiungi le seguenti righe al tuo Dockerfile
:
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN echo 'ubuntu:ubuntu' | chpasswd
La prima istruzione della shell è assicurarsi che -o pipefail
l'opzione è abilitata prima di RUN
con dentro una pipa. Leggi di più:Hadolint:Linting del tuo Dockerfile.
Per evitare le domande interattive di adduser, puoi chiamarlo con questi parametri:
RUN adduser --disabled-password --gecos '' newuser
Il --gecos
parametro viene utilizzato per impostare le informazioni aggiuntive. In questo caso è solo vuoto.
Sui sistemi con busybox (come Alpine), usa
RUN adduser -D -g '' newuser
Vedi busybox adduser