Dockerfile: CMD și ENTRYPOINT în Docker

Dockerfile Docker 1.0+

Definește procesul principal (PID 1) și argumentele implicite cu care pornește containerul.

Sintaxă comandă
ENTRYPOINT ["executabil", "param1"]
CMD ["arg_implicit_1", "arg_implicit_2"]

Ce face Dockerfile: CMD și ENTRYPOINT

Spre deosebire de RUN (care se execută o singură dată, la construirea imaginii), ENTRYPOINT și CMD spun ce proces pornește când lansezi un container cu docker run. Dacă există mai multe instrucțiuni CMD sau ENTRYPOINT într-un Dockerfile, doar ultima din fiecare are efect.

Diferența dintre ele se vede când dai argumente la sfârșitul comenzii docker run imagine argumente: argumentele date în linia de comandă înlocuiesc complet CMD, dar sunt adăugate la sfârșitul lui ENTRYPOINT. Dacă le folosești împreună (în forma exec cu paranteze drepte), ENTRYPOINT fixează executabilul, iar CMD oferă argumentele implicite care pot fi suprascrise ușor.

Folosește aproape întotdeauna forma exec (JSON cu ghilimele duble: ["node", "server.js"]). Forma shell (CMD node server.js) pornește procesul ca subproces al lui /bin/sh -c, astfel încât sh devine PID 1 și nu transmite semnalul SIGTERM aplicației la docker stop.

Opțiuni și argumente

Opțiune / Parametru Descriere
CMD ["exec", "arg"] Forma exec (recomandată): definește comanda și argumentele implicite ale containerului.
CMD ["arg1", "arg2"] Când este combinată cu ENTRYPOINT ["exec"], furnizează argumentele implicite pentru acel ENTRYPOINT.
ENTRYPOINT ["exec"] Transformă containerul într-un executabil dedicat; argumentele de la docker run i se adaugă la final.
CMD comandă (forma shell) Rulează prin /bin/sh -c; permite expandarea variabilelor $VAR, dar strică oprirea grațioasă cu SIGTERM.

Exemple

Exemplul 1: Aplicație web: doar CMD în forma exec

La docker run api pornește Gunicorn; la docker run -it api sh pornește shell-ul în locul lui.

FROM python:3.12-slim
WORKDIR /app
COPY . .
CMD ["gunicorn", "-b", "0.0.0.0:8000", "app:app"]

Exemplul 2: Container de tip utilitar CLI: ENTRYPOINT + CMD

Fără argumente afișează ajutorul (--help); cu argumente, le pasează direct lui curl.

FROM alpine:3.20
RUN apk add --no-cache curl
ENTRYPOINT ["curl", "-sS"]
CMD ["--help"]

Greșeli frecvente

  • Folosirea ghilimelelor simple în forma exec: CMD ['node', 'app.js'] nu este JSON valid și Docker îl interpretează greșit ca formă shell.
  • Folosirea formei shell (CMD python app.py) și apoi mirarea că docker stop stă blocat exact 10 secunde înainte să omoare containerul cu SIGKILL.

Comenzi înrudite

  • docker run: Creează și pornește un container nou dintr-o imagine.
  • docker start / docker stop: Pornește un container existent oprit sau oprește grațios un container care rulează.
  • Dockerfile: RUN: Execută comenzi în timpul construirii imaginii și salvează rezultatul într-un strat nou.
  • Dockerfile: ENV, ARG și EXPOSE: Definește variabile la build (ARG), variabile de mediu la rulare (ENV) și documentează porturile (EXPOSE).