从内部将SIGINT发送到docker容器

从内部将SIGINT发送到docker容器,docker,docker-compose,docker-container,Docker,Docker Compose,Docker Container,我一直在努力使它,使我能够关闭一个码头集装箱从内部。我已经读到使用tini是最好的方法 我已经将init:true添加到我的docker-compose.yml中,我可以看到docker init以PID 1的形式运行。但是,唯一允许我从shell脚本中关闭容器的命令是使用kill 1,但是我想优雅地关闭容器,以便它可以进行一些清理 我尝试过使用类似于kill-SIGINT 1的命令,这会导致错误kill:invalize选项-S 或者kill-int1和kill-21这两种方法似乎都没有任何作

我一直在努力使它,使我能够关闭一个码头集装箱从内部。我已经读到使用
tini
是最好的方法

我已经将
init:true
添加到我的docker-compose.yml中,我可以看到docker init以
PID 1
的形式运行。但是,唯一允许我从shell脚本中关闭容器的命令是使用
kill 1
,但是我想优雅地关闭容器,以便它可以进行一些清理

我尝试过使用类似于
kill-SIGINT 1
的命令,这会导致错误
kill:invalize选项-S
或者
kill-int1
kill-21
这两种方法似乎都没有任何作用


我似乎不知道我能用什么命令。如果有
init
的替代方案,这也是一个选项。

容器内的应用程序不需要任何特殊设置即可关闭;它可以运行自己的关闭序列并退出,当它退出时,容器也将退出。如果您试图从使用
docker exec
启动的调试shell中执行此操作,则可以使用
docker stop
发送SIGTERM,然后发送SIGKILL。(…并保留用于调试的
docker exec
shell;它不应该是您与容器交互的主要方式。)

如果需要向容器发送非默认信号,则具有以下选项:

docker kill --signal SIGINT container_name
就在调试shell中使用kill(1)而言,底层kill(2)函数说明:

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


它看起来像是
tini
相当广泛的信号,除了SIGFPE、SIGILL、SIGSEGV、SIGBUS、SIGABRT、SIGTRAP、SIGSYS和不可跟踪信号(尤其是SIGKILL)之外的所有信号。由于它确实注册了一个信号处理程序,
kill-INT 1
应该将该信号转发给实际的容器进程。(它的pid可能是2,因此
kill-INT 2
也应该告诉进程停止。)

我正在尝试在healthcheck脚本中执行此操作,我希望在该脚本中优雅地关闭容器
kill 1
有效,但我想使用SIGINT,而
kill-INT 1
不起任何作用。当我在容器内部使用
top
时,我可以看到
docker init
具有
PID 1
如果可以,我建议从容器外部启动健康检查。(这或多或少是Kubernetes使用的模式:如果运行状况检查失败,编排器将从外部终止容器。)如果必须从容器内部执行此操作,原则上可以启动运行状况检查器,然后监视尝试运行的服务器;也许这会取代init进程。