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 8080din Dockerfile să facă aplicația accesibilă pelocalhost:8080fără-p 8080:8080ladocker run. - Declararea unui
ARGînainte deFROMși folosirea lui dupăFROMfără a-l redeclara:FROMresetează domeniul de vizibilitate al argumentelorARG(adaugă o linieARG NUMEfă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.