Dockerfile: STOPSIGNAL în Docker

Dockerfile Docker 1.9+

Alege semnalul trimis procesului principal la docker stop (implicit SIGTERM), pentru o oprire curată a aplicației.

Sintaxă comandă
STOPSIGNAL <semnal>

Ce face Dockerfile: STOPSIGNAL

La docker stop, Docker trimite procesului principal (PID 1) semnalul din STOPSIGNAL, implicit SIGTERM, apoi așteaptă (implicit 10 secunde). Dacă procesul nu s-a oprit, trimite SIGKILL, care îl termină brusc, fără să mai salveze nimic.

Unele programe folosesc alt semnal pentru „oprire elegantă”: de exemplu nginx termină cererile în curs la SIGQUIT (imaginea oficială nginx are deja STOPSIGNAL SIGQUIT). Semnalul se poate da după nume (SIGQUIT) sau număr (3) și se poate suprascrie cu docker run --stop-signal sau, în Compose, cu stop_signal.

Parametri

Parametru Descriere
STOPSIGNAL SIGTERM Valoarea implicită.
STOPSIGNAL SIGQUIT Oprire elegantă pentru nginx și alte servere care o folosesc.
STOPSIGNAL SIGINT Echivalentul lui Ctrl+C; util pentru unele aplicații Python sau Node.js.
docker stop -t 30 Așteaptă 30 de secunde înainte de SIGKILL.
docker run --stop-signal Suprascrie semnalul din imagine.

Exemple

Exemplul 1: Server cu oprire elegantă la SIGQUIT

Imaginea proprie pornește de la Alpine, deci declarăm explicit semnalul de oprire.

FROM alpine:3.22
RUN apk add --no-cache nginx
COPY nginx.conf /etc/nginx/nginx.conf
STOPSIGNAL SIGQUIT
CMD ["nginx", "-g", "daemon off;"]

Exemplul 2: Verificarea semnalului și o oprire cu timp mai lung

Semnalul apare în configurația imaginii; la oprire acordăm 30 de secunde pentru cererile în curs.

docker inspect -f '{{.Config.StopSignal}}' web-iasi
docker stop -t 30 web-iasi

Ieșire în terminal

SIGQUIT
web-iasi

Greșeli frecvente

  • Pornirea aplicației printr-un script shell fără exec: PID 1 devine sh, care nu transmite semnalul aplicației, iar containerul este oprit cu SIGKILL după 10 secunde. Folosește exec node server.js în script sau forma JSON a lui CMD.
  • Așteptarea ca STOPSIGNAL să rezolve singur oprirea: aplicația trebuie să trateze semnalul (să închidă conexiunile, să salveze datele).

Comenzi înrudite

  • Dockerfile: SHELL: Schimbă shell-ul folosit de forma „shell” a instrucțiunilor RUN, CMD și ENTRYPOINT (implicit /bin/sh -c pe Linux).
  • docker wait: Așteaptă oprirea unuia sau mai multor containere și afișează codul de ieșire al fiecăruia.
  • docker pause / docker unpause: Îngheață toate procesele unui container (fără să le oprească) și le reia exact din același punct.