如何在关闭浏览器标签页/窗口时自动停止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
相关产品推荐
相关产品推荐

