我有一个程序在分离模式的 Docker 容器中运行。
那么如何向这个程序发送SIGINT等信号呢?
您可以使用
docker kill --signal="<signal>" <container name or id>
将任何信号发送到给定容器的根进程。
参见 https://docs.docker.com/engine/reference/commandline/kill/#send-a-custom-signal--to-a-container
您可以使用 nsenter 进入您的容器空间并发送信号。
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>
更多信息:http://jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil/
docker kill
用于向主容器进程发送信号,即 PID 为 1 的进程。$ docker kill --signal="SIGTERM" container-id/name
Dockerfile
。 (根据应用程序更新)FROM centos:6.7
# Install/Deploye the service below.
# Copy the shell script.
COPY entrypoint.sh /home
EXPOSE 8080
ENTRYPOINT ["/home/entrypoint.sh"]
下面是
entrypoint.sh
。 (根据应用程序更新它)。假设我们要重新启动一个 init.d
服务。
#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
$docker kill --signal="SIGUSR1" container-id/name
我设法通过以下方式向 docker 容器中的进程(程序)发送我想要的信号:
与
compose
合作时,这对我很有用:
docker compose kill -s <SIGNAL> <compose service name>
这将向容器的根进程发送指定的信号。
例如,我在容器内重新加载gunicorn WSGI服务器进程时遇到了问题。
docker compose kill -s HUP <my service name>
解决了问题。