docker kill
používá se k odesílání signálu do procesu hlavního kontejneru, tj. procesu s PID 1.- Jakákoli aplikace s PID 1 může zpracovávat signály přímo. Níže uvedený příkaz zabije hlavní proces dockeru:
$ docker kill --signal="SIGTERM" container-id/name
- Ale aplikace, která nemá PID 1, tj. aplikace je proces na pozadí:
- Nemůžeme odeslat single přímo do žádného procesu na pozadí spuštěného v kontejneru dockeru.
- V tomto případě potřebujeme zachytit a zpracovat uživatelsky definovaný signál ve skriptu shellu spuštěném jako vstupní bod.
- Mějme následující
Dockerfile
. (Aktualizujte jej podle aplikace)
FROM centos:6.7
# Install/Deploye the service below.
# Copy the shell script.
COPY entrypoint.sh /home
EXPOSE 8080
ENTRYPOINT ["/home/entrypoint.sh"]
-
Níže je
entrypoint.sh
. (Aktualizujte jej podle aplikace). Předpokládejme, že chceme restartovatinit.d
službu.#start the service /etc/init.d/<servicename> start pid="$!" # SIGUSR1- Single handler my_handler() { /etc/init.d/<servicename> restart } # Trap and handle the user defind singnal. trap 'my_handler' SIGUSR1 # wait forever(Alive container.) while true do tail -f /dev/null & wait ${!} done
- Vytvořte bitovou kopii dockeru a spusťte kontejner.
- Nyní můžete službu restartovat z hostitelského počítače:
$docker kill --signal="SIGUSR1" container-id/name
Můžete použít docker kill --signal="<signal>" <container name or id>
poslat jakýkoli signál do kořenového procesu daného kontejneru.
Viz https://docs.docker.com/engine/reference/commandline/kill/#send-a-custom-signal--to-a-container
Pomocí nsenter se můžete dostat do svého kontejnerového prostoru a odeslat svůj signál.
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid kill -SIGINT <PID of your program inside your container>
Více informací:http://jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil/