Dockerfile: ENV, ARG și EXPOSE în Docker

Dockerfile Docker 1.0+ (ARG 1.9+)

Definește variabile la build (ARG), variabile de mediu la rulare (ENV) și documentează porturile (EXPOSE).

Sintaxă comandă
ARG NUME[=valoare_implicită]
ENV NUME="valoare" [ALT_NUME="valoare"]
EXPOSE port[/tcp|/udp]

Ce face Dockerfile: ENV, ARG și EXPOSE

ARG și ENV definesc ambele variabile, dar au durate de viață diferite: ARG există doar în timpul lui docker build (și poate fi suprascrisă cu --build-arg), pe când ENV rămâne salvată în imagine și este vizibilă și în containerele pornite din ea (unde poate fi suprascrisă cu docker run -e).

O greșeală clasică de securitate este pasarea cheilor API sau a parolelor prin ARG sau ENV în Dockerfile: ambele rămân vizibile în clar pentru oricine are acces la imagine și rulează docker history --no-trunc sau docker inspect. Secretele de rulare se dau la docker run -e / Compose, iar cele de build cu RUN --mount=type=secret.

Instrucțiunea EXPOSE nu deschide și nu publică singură portul pe gazdă: este în primul rând documentație (arată pe ce port ascultă aplicația în container) și este folosită de docker run -P dacă vrei maparea automată pe un port aleatoriu.

Opțiuni și argumente

Opțiune / Parametru Descriere
ARG NUME=valoare Variabilă de build, suprascribilă cu docker build --build-arg NUME=.... Dispare în containerul care rulează.
ENV NUME=valoare Variabilă de mediu disponibilă atât în instrucțiunile RUN următoare, cât și în container la rulare.
EXPOSE 8080 Documentează că serviciul din container ascultă pe portul TCP 8080 (sau 8080/udp pentru UDP).

Exemple

Exemplul 1: Combinarea ARG și ENV pentru a fixa versiunea în imagine

Valoarea primită la build prin ARG este copiată într-un ENV ca aplicația să o poată citi la rulare.

FROM node:20-alpine
ARG APP_VERSION=dev
ENV NODE_ENV=production \
    PORT=3000 \
    APP_VERSION=${APP_VERSION}

WORKDIR /app
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

Greșeli frecvente

  • Așteptarea ca EXPOSE 8080 din Dockerfile să facă aplicația accesibilă pe localhost:8080 fără -p 8080:8080 la docker run.
  • Declararea unui ARG înainte de FROM și folosirea lui după FROM fără a-l redeclara: FROM resetează domeniul de vizibilitate al argumentelor ARG (adaugă o linie ARG NUME fără valoare după FROM).

Comenzi înrudite

  • docker build: Construiește o imagine pe baza unui Dockerfile și a unui context de build.
  • docker run: Creează și pornește un container nou dintr-o imagine.
  • Dockerfile: FROM și WORKDIR: Alege imaginea de bază a construcției și setează directorul curent de lucru în imagine.
  • Dockerfile: CMD și ENTRYPOINT: Definește procesul principal (PID 1) și argumentele implicite cu care pornește containerul.