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 derootși eșuează cu „Permission denied”. PuneUSERcâ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).