docker 容器中的超时命令不起作用

gyp*_*ark 6 timeout docker

我运行了以下命令:

docker run python:3.8-alpine /bin/sh -c "timeout 1s sleep 5"
Run Code Online (Sandbox Code Playgroud)

我预计它会在 1 秒后终止,但实际上花了 5 秒才终止。

如果我进入容器并执行如下命令,它会在 1 秒后正确终止:

docker run -it python:3.8-alpine /bin/sh
timeout 1s sleep 5
Run Code Online (Sandbox Code Playgroud)

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

Xir*_*hat 6

在 Docker 容器中,此进程/bin/sh -c "timeout 1s sleep 5"作为PID 1.

timeout命令使用SIGTERM来停止进程。

根据这个链接

Linux 会对容器内以 PID 1 身份运行的进程进行特殊处理:它会忽略具有默认操作的任何信号。因此,进程不会在 SIGINT 或 SIGTERM 时终止,除非它被编码为这样做。

并根据此链接

唯一可以发送到进程 ID 1(即 init 进程)的信号是 init 已显式安装信号处理程序的信号。这样做是为了确保系统不会意外崩溃。

您必须告诉 Docker 使用选项运行容器--init(运行 init 进程):

docker run --init python:3.8-alpine /bin/sh -c "timeout 1s sleep 5"
Run Code Online (Sandbox Code Playgroud)