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 devinesh, care nu transmite semnalul aplicației, iar containerul este oprit cuSIGKILLdupă 10 secunde. Foloseșteexec node server.jsîn script sau forma JSON a luiCMD. - Așteptarea ca
STOPSIGNALsă 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.