我运行了以下命令:
docker run python:3.8-alpine /bin/sh -c "timeout 1s sleep 5"
我预计它会在1秒钟后终止,但它花了5秒钟才终止。如果我进入容器并执行下面的命令,它会在1秒后正确终止:
docker run -it python:3.8-alpine /bin/sh timeout 1s sleep 5
为什么第一个命令的行为与预期的不同?
mu0hgdu01#
在Docker容器中,这个进程/bin/sh -c "timeout 1s sleep 5"作为PID 1运行。timeout命令使用SIGTERM停止进程。根据link:Linux会对容器内以PID 1运行的进程进行特殊处理:它忽略任何带有默认动作的信号。因此,进程不会在SIGINT或SIGTERM上终止,除非它被编码为这样做。根据link:唯一可以发送到进程ID 1(init进程)的信号是那些init显式安装了信号处理程序的信号,这样做是为了确保系统不会意外停机。你必须告诉Docker使用--init选项运行容器(运行init进程):
/bin/sh -c "timeout 1s sleep 5"
PID 1
timeout
SIGTERM
--init
docker run --init python:3.8-alpine /bin/sh -c "timeout 1s sleep 5"
2q5ifsrm2#
你也可以用trap杀死PID 1并杀死进程。Trap允许您捕获信号并在信号发生时执行代码。
trap
docker run python:3.8-alpine /bin/sh -c "trap "exit" SIGINT SIGTERM && timeout 1s sleep 5"
des4xlb03#
你也可以这样做:
timeout -s KILL 1s docker run python:3.8-alpine /bin/sh -c "sleep 5"
3条答案
按热度按时间mu0hgdu01#
在Docker容器中,这个进程
/bin/sh -c "timeout 1s sleep 5"
作为PID 1
运行。timeout
命令使用SIGTERM
停止进程。根据link:
Linux会对容器内以PID 1运行的进程进行特殊处理:它忽略任何带有默认动作的信号。因此,进程不会在SIGINT或SIGTERM上终止,除非它被编码为这样做。
根据link:
唯一可以发送到进程ID 1(init进程)的信号是那些init显式安装了信号处理程序的信号,这样做是为了确保系统不会意外停机。
你必须告诉Docker使用
--init
选项运行容器(运行init进程):2q5ifsrm2#
你也可以用
trap
杀死PID 1
并杀死进程。Trap允许您捕获信号并在信号发生时执行代码。
des4xlb03#
你也可以这样做: