You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Azure Web App容器实现优雅停机(响应SIGTERM)

Azure Web App容器响应SIGTERM信号配置方案

核心需求

使用Azure Web App托管Docker容器时,实现容器接收并响应SIGTERM信号,完成Python应用和Java Bot的优雅停机,避免进程强制终止导致的数据丢失或异常。

具体配置步骤

1. 完善entrypoint.sh脚本

你提供的脚本已实现SIGTERM信号捕获与优雅清理逻辑,需注意以下细节:

  • 脚本开头的#!/bin/bash确保使用bash解释器
  • 通过trap 'cleanup' SIGTERM注册信号处理函数
  • 后台启动进程后记录PID,便于后续精准终止
  • wait -n保证任意进程异常退出时也能触发清理流程

脚本代码如下:

#!/bin/bash

# 优雅停止进程并清理的函数
cleanup() {
    echo "Received termination signal. Stopping processes gracefully..."

    # 停止Python应用
    echo "Stopping app..."
    kill $python_pid

    # 停止Java Bot
    echo "Stopping Bot"
    kill $java_pid

    # 等待进程完全终止
    wait $python_pid
    wait $java_pid

    echo "All processes have been stopped. Exiting..."
    exit 0
}

# 捕获SIGTERM信号并调用清理函数
trap 'cleanup' SIGTERM

# 启动ML应用
cd /app
echo "Starting app..."
gunicorn --log-level debug --access-logfile - --error-logfile - -b :5000 wsgi:app &
python_pid=$!

# 启动Slack Bot
cd /bot
echo "Starting Bot."
java -jar hrbs.jar &
java_pid=$!

# 等待任意进程结束
wait -n $python_pid $java_pid

# 异常退出时执行清理(正常场景下不会走到这里)
cleanup

2. Dockerfile配置(关键:确保脚本以PID 1运行)

只有PID 1进程才能接收宿主机发送的SIGTERM信号,需在Dockerfile中正确设置ENTRYPOINT,让脚本成为容器的PID 1进程:

# 选择合适的基础镜像(示例为Python+Java混合环境)
FROM python:3.9-slim-bullseye

# 安装Java运行时(根据你的Bot版本调整)
RUN apt-get update && apt-get install -y openjdk-11-jre-headless && rm -rf /var/lib/apt/lists/*

# 复制应用文件到容器
COPY ./app /app
COPY ./bot /bot
COPY entrypoint.sh /entrypoint.sh

# 赋予脚本执行权限
RUN chmod +x /entrypoint.sh

# 设置ENTRYPOINT,确保脚本作为PID 1进程启动
ENTRYPOINT ["/entrypoint.sh"]

3. Azure Web App优雅停机配置

在Azure门户中完成以下设置,给容器足够的时间处理SIGTERM信号:

  • 进入你的Web App -> 配置 -> 常规设置
  • 找到优雅停机超时选项,设置合理的超时时间(建议30-60秒),确保容器有足够时间完成进程清理
  • 无需额外设置启动命令,Dockerfile中的ENTRYPOINT会自动生效

验证方法

重启Azure Web App后,查看容器日志(Web App -> 日志流),若能看到Received termination signal. Stopping processes gracefully...等日志内容,说明SIGTERM信号已被成功捕获并处理。

常见问题排查

  • 若脚本未接收到SIGTERM:检查容器内PID 1进程是否为entrypoint.sh,可通过docker exec <容器ID> ps aux查看。若PID 1是bash或其他进程,需调整Dockerfile的ENTRYPOINT配置,确保脚本直接作为PID 1启动。
  • 进程无法正常停止:检查kill命令是否能正确终止目标进程,若进程忽略SIGTERM,可尝试使用kill -SIGINT作为兜底方案(优先优化进程自身的信号响应逻辑,避免强制终止)。

内容的提问来源于stack exchange,提问作者Kraken194

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:23:14