Dockerfile: RUN în Docker

Dockerfile Docker 1.0+

Execută comenzi în timpul construirii imaginii și salvează rezultatul într-un strat nou.

Sintaxă comandă
RUN [opțiuni] comandă && comandă...
RUN ["executabil", "arg1", "arg2"]

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 și RUN apt-get install ... pe două linii: când adaugi un pachet nou mai târziu, Docker ia apt-get update din cache-ul vechi de săptămâni și instalarea eșuează cu 404 Not Found.
  • Ștergerea fișierelor temporare într-un RUN separat: imaginea nu devine mai mică, pentru că fișierele rămân în stratul anterior.

Comenzi înrudite