Một container chạy ổn nhưng khi dừng lại không in log dọn dẹp. Để tìm nguyên nhân, hãy xác định tín hiệu mà Docker gửi, tiến trình nào nhận và tiến trình đó xử lý ra sao. Ba câu hỏi này giúp khoanh vùng lỗi trước khi kéo dài thời gian chờ dừng.
Ví dụ và cách đọc
STOPSIGNAL ghi tín hiệu dừng mặc định vào cấu hình image. Docker dùng SIGTERM nếu chưa cấu hình và có thể override riêng khi tạo container. Ví dụ dùng exec form để chạy shell thử trực tiếp, đăng ký trap rồi giữ process sống bằng vòng lặp ngắn. Dùng tag BusyBox 1.37 từ danh mục Official Images đã đối chiếu, chạy thử ở môi trường riêng.
FROM busybox:1.37
STOPSIGNAL SIGTERM
CMD ["sh", "-c", "trap 'echo stopping; exit 0' TERM; while :; do sleep 1; done"]
Kiểm tra kết quả
Trên máy có Docker, build image thử, chạy container với tên riêng, rồi dùng docker stop và đọc log của đúng container đó. Đợi shell đã vào vòng lặp trước khi dừng. Kỳ vọng có dòng stopping khi trap xử lý TERM. Kiểm tra cả trạng thái thoát và log. Mẫu được rà theo tài liệu Dockerfile, chưa build hoặc đo trên daemon trong lượt này.
Áp dụng và giới hạn
Trong ứng dụng thật, xem ENTRYPOINT có thêm shell trung gian hay không và kiểm tra tín hiệu đến được tiến trình cần dọn dẹp. Một service có thể cần ngừng nhận yêu cầu mới trước khi hoàn tất công việc đang chạy. Tách kiểm tra điều đó khỏi việc cấu hình tên tín hiệu. Kiểm tra runtime triển khai vì trình điều phối có thể đặt chính sách dừng riêng. Đừng suy ra hành vi Ctrl+C từ cấu hình STOPSIGNAL.
Tình huống áp dụng
Trước khi thử, tạo một thư mục riêng chỉ chứa Dockerfile và chọn một tên image chưa dùng. Dùng docker image inspect để đọc trường Config.StopSignal của image vừa build. Sau đó kiểm tra container có cấu hình override hay không bằng docker inspect. Ghi hai giá trị đó cạnh kết quả quan sát để tránh đọc nhầm một container chạy từ image cũ.
Với service có lưu dữ liệu, chuẩn bị bài thử có một công việc ngắn đang chạy và một dấu hiệu hoàn tất có thể quan sát được. Kiểm tra thời điểm nhận yêu cầu dừng, thời điểm ngừng nhận việc mới và kết quả của công việc còn lại. Nếu có nhiều tiến trình, xác định tiến trình nào ghi log và tiến trình nào phải chờ. Đừng tăng thời gian chờ chỉ vì log thiếu một dòng. Xác nhận trước rằng phiên bản triển khai nhận đúng tín hiệu và trình tự dọn dẹp thật sự được gọi.


