Hãy xem xét những điều sau đây, chạy sleep 60
trong nền và sau đó thoát ra:Điều gì xảy ra với các quá trình khác khi PID1 của vùng chứa Docker thoát?
$ cat run.sh
sleep 60&
ps
echo Goodbye!!!
$ docker run --rm -v $(pwd)/run.sh:/run.sh ubuntu:16.04 bash /run.sh
PID TTY TIME CMD
1 ? 00:00:00 bash
5 ? 00:00:00 sleep
6 ? 00:00:00 ps
Goodbye!!!
này sẽ bắt đầu một container Docker, với bash
như PID1. Sau đó nó fork/execs một quá trình sleep
, và sau đó bash
thoát. Khi container Docker chết, quá trình sleep
bằng cách nào đó cũng chết.
Câu hỏi của tôi là: cơ chế mà quá trình sleep
bị giết là gì? Tôi đã thử bẫy SIGTERM
trong một quá trình con và dường như không bị vấp. Giả định của tôi là một cái gì đó (hoặc Docker hoặc hạt nhân Linux) đang gửi SIGKILL
khi tắt cgroup container đang sử dụng, nhưng tôi đã không tìm thấy tài liệu nào ở bất cứ nơi nào làm rõ điều này.
EDIT Gần nhất tôi đã đi đến một lời giải thích là đoạn trích sau đây từ baseimage-docker:
Nếu quá trình init của bạn là ứng dụng của bạn, sau đó nó sẽ có lẽ chỉ đóng cửa chính nó, không phải tất cả các các quy trình khác trong vùng chứa. Sau đó, hạt nhân sẽ tiêu diệt các quy trình khác một cách mạnh mẽ, không cho họ cơ hội để tắt trơn tru, có khả năng dẫn đến hỏng tệp, tệp tạm thời cũ, v.v. Bạn thực sự muốn tắt tất cả các quy trình của mình một cách duyên dáng.
Vì vậy, ít nhất theo điều này, hàm ý là khi thùng chứa thoát, hạt nhân sẽ gửi SIGKILL đến tất cả các quy trình còn lại. Nhưng tôi vẫn muốn rõ ràng về cách nó quyết định làm điều đó (tức là, nó là một tính năng của các nhóm?), Và lý tưởng là một nguồn có thẩm quyền hơn sẽ là tốt đẹp.
Có thể cho dockers 'runc' để làm sạch lên nếu bạn đang [chạy trong các máy chủ tên miền không gian pid] (https://github.com/opencontainers/runc/blob/c4e0d94efacd6f6fb353a538cc01d10792cc3a35 /libcontainer/state_linux.go#L41-L45). – Matt
và hạt nhân gửi 'SIGKILL' để chấm dứt các quá trình. – Matt
@Matt Tốt để biết. Liệu nó có trở thành trách nhiệm của tiến trình 'init' của máy chủ để gặt hái những thứ đó, hay hạt nhân loại bỏ chúng khỏi chính bảng quá trình? –