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

如何在关闭浏览器标签页/窗口时自动停止Docker容器?

实现关闭浏览器时自动停止Streamlit容器的方法

默认情况下,容器不会因为浏览器标签页/窗口关闭而自动停止——因为容器内的Streamlit进程仍在后台运行。要实现这个需求,可以通过以下两种方案:

方案一:在Streamlit应用中添加前端监听+后端触发停止

通过在应用中嵌入JavaScript监听浏览器关闭事件,发送停止信号到后端,再由后端执行容器停止命令:

  • 在Streamlit代码中嵌入前端监听逻辑,监听beforeunload事件(浏览器关闭/刷新时触发):
    import streamlit as st
    import subprocess
    
    # 嵌入JS监听浏览器关闭事件
    st.components.html("""
    <script>
    window.addEventListener('beforeunload', function() {
        fetch('http://localhost:8501/stop-container', {method: 'POST'});
    });
    </script>
    """, height=0)
    
    # 添加自定义端点处理停止请求
    def stop_container():
        subprocess.run(["docker", "stop", "your-streamlit-container"])
    
    # 注册端点(需要Streamlit 1.28+版本支持)
    st.server.server.add_routes([
        ("POST", "/stop-container", lambda request: stop_container())
    ])
    
    # 你的Streamlit应用逻辑
    st.title("测试应用")
    
  • 注意:容器需要挂载宿主的/var/run/docker.sock(启动容器时添加参数-v /var/run/docker.sock:/var/run/docker.sock),并且容器内要安装docker-cli,这样才能在容器内执行docker stop命令。

方案二:宿主机器定时监测端口连接数

通过脚本定时检查8501端口的活跃连接数,当连接数为0时停止容器:

  • 编写Shell脚本check_streamlit_conn.sh:
    #!/bin/bash
    CONTAINER_NAME="your-streamlit-container"
    TARGET_PORT=8501
    
    while true; do
        # 统计目标端口的已建立连接数
        CONN_COUNT=$(ss -t state established '( dport = :'"$TARGET_PORT"' )' | wc -l)
        if [ "$CONN_COUNT" -eq 0 ]; then
            echo "无活跃连接,停止容器..."
            docker stop "$CONTAINER_NAME"
            exit 0
        fi
        sleep 3
    done
    
  • 给脚本添加执行权限:chmod +x check_streamlit_conn.sh
  • 启动Streamlit容器后,在宿主机器上运行脚本:./check_streamlit_conn.sh

注意事项

  • 如果用户打开多个浏览器标签页,需等待所有标签页关闭后,连接数才会归零,容器才会停止。
  • 若网络异常断开(而非正常关闭浏览器),可能存在监测延迟,可根据需求调整脚本的检查间隔。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:27:40