我运行了以下命令:
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)
为什么第一个命令的行为与预期不同?
在 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)
归档时间: |
|
查看次数: |
1098 次 |
最近记录: |