Ce face Dockerfile: RUN
Instrucțiunea RUN pornește un container temporar din stratul anterior, execută comanda (implicit prin /bin/sh -c pe Linux) și salvează modificările aduse sistemului de fișiere ca un strat nou și imuabil al imaginii. Se folosește pentru instalarea pachetelor de sistem, compilarea codului sau crearea de utilizatori.
Deoarece fiecare strat rămâne în istoria imaginii, un fișier creat într-un RUN și șters într-un RUN următor continuă să ocupe spațiu în imaginea finală. De aceea actualizarea listelor de pachete, instalarea și ștergerea cache-ului (rm -rf /var/lib/apt/lists/*) se înlănțuie într-o singură instrucțiune RUN cu &&.
Cu BuildKit (activ implicit în Docker 23+) poți folosi RUN --mount=type=cache pentru a păstra cache-ul lui apt, pip sau npm între build-uri fără a-l include în imaginea finală.
Opțiuni și argumente
| Opțiune / Parametru | Descriere |
|---|---|
RUN comandă |
Forma shell: este interpretată de /bin/sh -c, deci suportă &&, |, redirecționări și variabile $VAR. |
RUN ["exec", "arg"] |
Forma exec: rulează direct executabilul, fără shell. |
--mount=type=cache,target=... |
Montează un director de cache persistent între build-uri (nu ajunge în imaginea finală). |
--mount=type=secret,id=... |
Expune temporar un secret în timpul acelui RUN, fără a-l lăsa în straturile imaginii. |
Exemple
Exemplul 1: Instalare curată de pachete pe Debian/Ubuntu într-un singur strat
Combinăm apt-get update, install și ștergerea listelor în același RUN.
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
curl \
libpq5 \
&& rm -rf /var/lib/apt/lists/*
Exemplul 2: Pe Alpine Linux: apk add –no-cache
Opțiunea --no-cache evită păstrarea indexului de pachete în imagine.
RUN apk add --no-cache curl tzdata
Greșeli frecvente
- Separarea
RUN apt-get updateșiRUN apt-get install ...pe două linii: când adaugi un pachet nou mai târziu, Docker iaapt-get updatedin cache-ul vechi de săptămâni și instalarea eșuează cu404 Not Found. - Ștergerea fișierelor temporare într-un
RUNseparat: imaginea nu devine mai mică, pentru că fișierele rămân în stratul anterior.
Comenzi înrudite
docker build: Construiește o imagine pe baza unui Dockerfile și a unui context de build.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.Dockerfile: Multi-stage builds: Construiește aplicația într-o etapă cu compilatoare și copiază doar rezultatul într-o imagine finală mică.