gpt4 book ai didi

bash - 当 docker 以 PID 1 运行时,为什么我不能在 docker 中 CTRL-C sleep 无穷大

转载 作者:行者123 更新时间:2023-12-02 18:30:51 30 4
gpt4 key购买 nike

案例:我们有一个运行 bash 脚本的 docker 容器,该脚本需要永远“阻塞”(因为它为另一个容器公开了一个卷,但有时我们需要这样做还有其他原因)。

我当时认为这可以工作:

exec sleep infinity;

ps aux 然后将“ sleep ”作为 PID 1。太好了,我想,然后它将接收我们从容器外部发送的信号。例如:
docker kill -s INT container_name

但这不起作用,容器继续运行(也适用于 SIGTERM)。正常的杀戮确实有效,但我不明白为什么会有区别(这让我很恼火):
docker kill container_name

当它在我的容器中作为 PID 1 运行时,为什么我不能用 SIGINT/SIGTERM 杀死“ sleep ”?我相信当它们在容器中作为 PID 1 运行时,我可以使用 SIGINT/SIGTERM 杀死其他东西(如 bash 脚本)。

最佳答案

这会有什么用吗? https://www.fpcomplete.com/blog/2016/10/docker-demons-pid1-orphans-zombies-signals

基本上问题在于进程号 1。Linux/unix 内核不愿意以常规方式向该进程发出信号,因为它应该是 init。如果 init 进程死掉,系统会立即发出 panic 并重新启动。如果您的进程 1 没有信号处理程序,则该信号将被丢弃。 Sleep 没有任何信号处理程序,但您可以构建一个 bash 脚本。

基本上你需要做的是在你的 dockerfile 中使用 exec 形式,并将你的 sleep infinity 分成一个循环,因为在 shell 执行命令时不会触发 bash 陷阱。这会向正在运行的进程 1 发送一个信号并捕获它:

Dockerfile:

FROM ubuntu
ADD foo.sh /tmp
RUN ["/tmp/foo.sh"]

foo.sh:
#!/bin/bash

trap "echo signal;exit 0" SIGINT

while :
do
sleep 1
done

这将对 docker kill --signal=SIGINT 使用react。

关于bash - 当 docker 以 PID 1 运行时,为什么我不能在 docker 中 CTRL-C sleep 无穷大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45148381/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com