Docker 中的信号陷阱

问题描述 投票:0回答:1

我有一个脚本需要在另一个程序中循环运行。但我想捕获信号以优雅地停止循环。

这是我的可重现代码:

loop.sh

#!/bin/bash
COMMAND="logic.sh"
terminate=false

trap 'terminate=true' SIGTERM SIGINT

while true; do
    if $terminate; then
        echo "Termination signal received, waiting for the current process to finish..."
        wait
        echo "Process finished. Exiting..."
        exit 0
    fi
    $COMMAND &
    wait $!
done

logic.sh

#!/bin/bash
sleep 5
date +%s

Dockerfile

# FROM debian
FROM php:8.3-fpm
ADD loop.sh logic.sh /usr/local/bin/
CMD ["loop.sh"]

compose.yml

services:
  app:
    build: .
    entrypoint: ''
    init: true

为了测试它,我运行

docker compose up --build
;并在另一个终端
docker compose stop
。 如果您看到
Termination signal received, waiting for the current process to finish...
然后是时间戳,则说明它正在工作。 使用
FROM php:8.3-fpm
时,它无法按预期工作...但是使用
FROM debian
时,可以。

为什么它的行为不一样?我怎样才能使它与

FROM php:...
一起工作?
谢谢

linux docker signals
1个回答
0
投票

如果您使用

检查图像历史记录
docker history php:8.3-fpm

您将看到该图像使用

QUIT
信号来通知进程是时候清理并离开了:

<missing>      11 days ago   STOPSIGNAL SIGQUIT                              0B        buildkit.dockerfile.v0

这意味着如果您想优雅地退出所包含的进程,您应该在陷阱中添加

QUIT
信号。

© www.soinside.com 2019 - 2024. All rights reserved.