Proces, w którym działa dokowanie, zajmuje miejsce init w drzewie procesu UNIX. init
jest najwyższym procesem nadrzędnym, a po jego zakończeniu zatrzymuje się kontener dokowania. Wszystkie procesy potomne (teraz orphan process) również zostaną zatrzymane.
$ docker pull busybox >/dev/null
$ time docker run --rm busybox sleep 3
real 0m3.852s
user 0m0.179s
sys 0m0.012s
Nie można dopuścić, aby pid dla rodziców został wyłączony, ale istnieją dwie opcje. Można zostawić procesu nadrzędnego w miejscu i pozwolić mu zarządzać jego dzieci (na przykład, mówiąc jej wait
aż wszystkie procesy potomne wysuną)
$ time docker run --rm busybox sh -c 'sleep 3 & wait'
real 0m3.916s
user 0m0.178s
sys 0m0.013s
... czy można zastąpić procesu macierzystego z procesu potomnego przy użyciu exec
. Oznacza to, że nowa komenda jest wykonywany w przestrzeni procesu nadrzędnego za ...
$ time docker run --rm busybox sh -c 'exec sleep 3'
real 0m3.886s
user 0m0.173s
sys 0m0.010s
To drugie podejście może być złożone w zależności od charakteru procesu potomnego, ale mają mniej niepotrzebnych uruchomionych procesów jest bardziej idiomatically dokowanym. (Co nie oznacza, że powinieneś mieć tylko jeden proces: .)