Container PID 1 và tín hiệu dừng
Tại sao shutdown không graceful làm mất request hoặc hỏng queue.
Nắm bản chất
PID 1 trong container nhận signals khi runtime yêu cầu dừng. Nếu ứng dụng dùng
shell wrapper không exec, signal có thể không đến tiến trình chính
đúng cách. Vì vậy Dockerfile nên chạy ứng dụng dạng exec-form
CMD ["program","arg"], hoặc entrypoint script
dùng exec "$@".
Một dịch vụ production cần xử lý SIGTERM, ngừng nhận công việc mới, hoàn thành hoặc checkpoint công việc đang chạy và giải phóng tài nguyên trước termination grace period. Healthcheck không thay thế graceful shutdown.
Luồng hoạt động
Hãy tự giải thích mỗi mũi tên: dữ liệu, quyền hoặc tín hiệu nào được truyền qua bước này?
Lệnh & cấu hình mẫu
FROM python:3.13-slim
WORKDIR /app
COPY app.py .
CMD ["python", "app.py"]
docker stop --time 20 my-service
docker inspect my-service --format '{{.State.ExitCode}}'
Lệnh có placeholder hoặc phụ thuộc môi trường thì cần thay thông tin thực tế, kiểm tra quyền và chỉ thực hiện trên tài nguyên được phép.
Bài tập 10–20 phút
Viết một Python process đăng ký SIGTERM handler và in logs khi thoát. Kiểm
tra khác biệt giữa docker stop và docker kill.
Lỗi dễ mắc
Một Worker ACK message trước khi ghi kết quả bền vững có thể làm mất công việc khi bị SIGKILL. Thiết kế commit/ACK theo đúng thứ tự.
Tự kiểm tra
Tại sao `exec` trong entrypoint script có ích?Xem đáp án ↗
Nó thay shell bằng ứng dụng làm PID chính, giúp signals và exit status được xử lý trực tiếp hơn.
Học thêm qua lab
Bài học nền tảng có thể thực hiện trực tiếp bằng các lệnh trên; bảng tra cứu nhanh giúp ôn tập.
→ Mở bảng lệnh tra cứu nhanhĐối chiếu tài liệu gốc
Cú pháp và khả năng hỗ trợ có thể thay đổi theo phiên bản. Trước khi dùng Production, hãy kiểm tra tài liệu tương ứng.
Mở tài liệu chính thức ↗