Dockerfile: ONBUILD în Docker

Dockerfile Docker 1.0+

Înregistrează instrucțiuni care nu rulează acum, ci la build-ul imaginilor care pornesc FROM această imagine.

Sintaxă comandă
ONBUILD <INSTRUCȚIUNE>

Ce face Dockerfile: ONBUILD

ONBUILD este un „declanșator” pentru imagini de bază. Instrucțiunea de după el (de exemplu ONBUILD COPY . /app) nu se execută când construiești imaginea de bază, ci este salvată și rulată automat imediat după linia FROM din Dockerfile-ul care o folosește.

Astfel o echipă poate oferi o imagine de bază („toate serviciile noastre Python se construiesc așa”), iar proiectele scriu doar FROM firma/python-baza. Declanșatoarele se aplică doar copiilor direcți, nu și „nepoților”. Nu sunt permise ONBUILD FROM și ONBUILD ONBUILD. Pentru că pașii ascunși pot surprinde, multe echipe preferă astăzi un Dockerfile explicit sau un șablon.

Parametri

Parametru Descriere
ONBUILD COPY . /app Copiază codul proiectului copil la build-ul acestuia.
ONBUILD RUN comandă Rulează o comandă în build-ul imaginii copil.
docker inspect -f '{{.Config.OnBuild}}' Arată declanșatoarele salvate în imagine.

Exemple

Exemplul 1: Imagine de bază pentru serviciile Python ale echipei

Imaginea firma/python-baza pregătește mediul, iar instalarea dependențelor și copierea codului se fac în proiectul care o folosește.

# firma/python-baza
FROM python:3.13-slim
WORKDIR /app
ONBUILD COPY requirements.txt .
ONBUILD RUN pip install --no-cache-dir -r requirements.txt
ONBUILD COPY . .
CMD ["python", "main.py"]

Exemplul 2: Dockerfile-ul unui serviciu și declanșatoarele salvate

Serviciul de facturare are un Dockerfile de o singură linie; cei trei pași ONBUILD salvați în imaginea de bază rulează la build-ul lui, imediat după FROM.

echo 'FROM firma/python-baza:1.0' > Dockerfile
docker inspect -f '{{json .Config.OnBuild}}' firma/python-baza:1.0
docker build -t facturare .

Ieșire în terminal

["COPY requirements.txt .","RUN pip install --no-cache-dir -r requirements.txt","COPY . ."]

Greșeli frecvente

  • Așteptarea ca ONBUILD să ruleze la build-ul imaginii de bază: acolo doar se înregistrează. Testează imaginea construind un proiect copil.
  • Lanțuri de trei niveluri: declanșatoarele nu ajung la „nepoți”. Dacă imaginea B pornește din A și C din B, pașii ONBUILD din A rulează doar la build-ul lui B.

Comenzi înrudite

  • Dockerfile: LABEL: Adaugă metadate cheie-valoare imaginii (versiune, autor, depozit sursă), vizibile cu docker inspect și folosite la filtrare.
  • Dockerfile: SHELL: Schimbă shell-ul folosit de forma „shell” a instrucțiunilor RUN, CMD și ENTRYPOINT (implicit /bin/sh -c pe Linux).