는 백그라운드에서 sleep 60
을 실행하고 다음은, 종료 고려 :Docker 컨테이너의 PID1이 종료되면 다른 프로세스는 어떻게됩니까?
$ 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!!!
이것은 PID1로 bash
과 더불어, 부두 노동자 컨테이너를 시작합니다. 그런 다음 sleep
프로세스를 포크/실행 한 다음 bash
을 종료합니다. Docker 컨테이너가 죽으면 sleep
프로세스가 어떻게 든 죽습니다.
내 질문은 : sleep
프로세스가 종료되는 메커니즘은 무엇입니까? 나는 자식 프로세스에서 SIGTERM
을 트랩하려고 시도했는데, 그것은 트립되지 않는 것처럼 보입니다. 컨테이너가 사용중인 cgroup을 종료 할 때 무언가 (Docker 또는 Linux 커널)가 SIGKILL
을 보내는 것으로 추정되지만 아무 것도 발견하지 못했습니다. 당신의 init 프로세스 앱의 경우, 그것은 아마 단지 자체를하지 모두 종료거야,
:
편집 내가 설명 오셨습니다 가장 가까운 다음 baseimage-docker에서 인용입니다 컨테이너의 다른 프로세스. 그런 다음 커널은 정상적으로 종료 할 기회를주지 않고 다른 프로세스를 강제 종료하여 잠재적으로 파일 손상, 부실한 임시 파일 등을 초래할 수 있습니다. 모든 프로세스를 정상적으로 종료하고 싶습니다.
따라서 적어도 컨테이너가 종료되면 커널은 나머지 모든 프로세스에 SIGKILL을 보냅니다. 그러나 나는 그것을 (즉, cgroup의 특징입니까?) 결정하는 방법에 대한 명확성을 원합니다. 이상적으로는 더 권위있는 정보원이 좋을 것입니다.
이 가능 https://github.com/opencontainers/runc/blob/c4e0d94efacd6f6fb353a538cc01d10792cc3a35 /libcontainer/state_linux.go#L41-L45). – Matt
커널은'SIGKILL'을 보내 프로세스를 종료합니다. – Matt
@Matt 잘 알고 있습니다. 그것들을 얻기위한 호스트'init' 프로세스의 책임이 될 것인가 아니면 커널이 프로세스 테이블 자체에서 그것들을 제거 하는가? –