Dockerfile: USER în Docker

Dockerfile Docker 1.0+

Stabilește utilizatorul (și grupul) cu care rulează instrucțiunile următoare și procesul principal al containerului.

Sintaxă comandă
USER <utilizator>[:<grup>]
USER <UID>[:<GID>]

Ce face Dockerfile: USER

Implicit, procesele dintr-un container rulează ca root. Instrucțiunea USER schimbă utilizatorul pentru toate instrucțiunile RUN, CMD și ENTRYPOINT care urmează după ea în Dockerfile. Dacă aplicația are o vulnerabilitate, atacatorul primește doar drepturile acestui utilizator obișnuit, nu pe cele de root.

Utilizatorul trebuie creat înainte (cu adduser/useradd) dacă îl dai după nume; un UID numeric funcționează și fără o intrare în /etc/passwd. USER nu schimbă proprietarul fișierelor copiate: COPY le scrie ca root, așa că folosește COPY --chown=app:app pentru fișierele pe care aplicația trebuie să le modifice. La rulare, utilizatorul se poate suprascrie cu docker run --user.

Parametri

Parametru Descriere
USER app Rulează ca utilizatorul app (trebuie să existe în imagine).
USER app:app Utilizator și grup, după nume.
USER 1001:1001 UID și GID numerice; funcționează și fără utilizator creat.
COPY --chown=app:app Copiază fișierele cu proprietarul dat, nu cu root.
docker run --user 1001 Suprascrie utilizatorul din imagine la pornirea containerului.

Exemple

Exemplul 1: Aplicație Node.js care rulează fără root

Creăm utilizatorul app cu UID fix 1001, copiem codul cu proprietarul corect și abia apoi trecem pe el.

FROM node:22-alpine
RUN addgroup -S -g 1001 app && adduser -S -u 1001 -G app app
WORKDIR /app
COPY --chown=app:app package*.json ./
RUN npm ci --omit=dev
COPY --chown=app:app . .
USER app
CMD ["node", "server.js"]

Exemplul 2: Verificarea utilizatorului din container

După build, comanda id rulată în container confirmă utilizatorul.

docker build -t magazin-api .
docker run --rm magazin-api id

Ieșire în terminal

uid=1001(app) gid=1001(app) groups=1001(app)

Greșeli frecvente

  • Mutarea lui USER app înaintea pașilor care instalează pachete (apk add, apt-get install): aceștia au nevoie de root și eșuează cu „Permission denied”. Pune USER cât mai jos, după instalări.
  • Ascultarea pe portul 80 cu un utilizator obișnuit: în unele medii, porturile sub 1024 cer privilegii. Folosește un port ca 8080 în container și mapează-l cu -p 80:8080.

Comenzi înrudite

  • Dockerfile: VOLUME: Marchează un director din imagine ca punct de montare pentru date persistente; Docker creează automat un volum anonim dacă nu dai altul.
  • Dockerfile: SHELL: Schimbă shell-ul folosit de forma „shell” a instrucțiunilor RUN, CMD și ENTRYPOINT (implicit /bin/sh -c pe Linux).