docker容器中的timeout命令不起作用

fnvucqvd  于 2023-03-29  发布在  Docker
关注(0)|答案(3)|浏览(290)

我运行了以下命令:

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

为什么第一个命令的行为与预期的不同?

mu0hgdu0

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进程):

docker run --init python:3.8-alpine /bin/sh -c "timeout 1s sleep 5"
2q5ifsrm

2q5ifsrm2#

你也可以用trap杀死PID 1并杀死进程。
Trap允许您捕获信号并在信号发生时执行代码。

docker run python:3.8-alpine /bin/sh -c "trap "exit" SIGINT SIGTERM && timeout 1s sleep 5"
des4xlb0

des4xlb03#

你也可以这样做:

timeout -s KILL 1s docker run python:3.8-alpine /bin/sh -c "sleep 5"

相关问题