在 Dash 容器内实现多用户会话隔离
解读
面试官问“在 Dash 容器内实现多用户会话隔离”,表面看是 Python Web 框架 Dash 的多租户问题,实质考察的是容器化场景下如何把“进程级隔离”升级为“用户级隔离”。国内主流做法不是改 Dash 源码,而是用 Docker 层能力把“用户身份”映射到“容器身份”,再辅以 Dash 自身的回调上下文过滤,实现轻量级、可横向扩展的 SaaS 隔离。回答时要体现“镜像最小化、无状态、秒级扩缩容、符合等保”这些国内甲方硬性指标。
知识点
- Linux UID/GID 映射:容器内非 root 运行 Dash,宿主机通过
--user $(id -u):$(id -g)把宿主机用户映射进容器,防止容器逃逸。 - tmpfs + Overlay2:把 Dash 上传的临时文件挂到
tmpfs并启用overlay2的index=on,实现用户级写时复制隔离,重启即清,符合等保“数据不落地”要求。 - Dash 回调上下文:利用
flask.g和session[_user_id]在回调链最前端加装饰器,把用户身份注入到每次 Plotly 请求,阻断跨用户越权。 - Docker Compose 多实例:同一镜像启多个容器,通过 labels 把 user_id 与容器名绑定,再挂到统一 Traefik 路由,实现“单镜像、多容器、每用户一个实例”,秒级横向扩容。
- Secret 与 Env 分离:把数据库连接串、JWT 密钥放在 Docker Swarm Secret 或 K8s Secret,禁止写进镜像层,满足国内《个人信息保护法》对密钥 rotation 的审计要求。
- Cgroup V2 + systemd:在宿主机启用
Delegate=cpu,memory,给每个用户容器单独 slice,防止某用户 Dash 跑大数据把节点打挂,符合金融客户 SLA 99.95%。
答案
步骤一:构建最小安全镜像
Dockerfile 采用官方 python:3.11-slim,创建 uid=1000 的 dash 用户,pip install --user 把包装到 /home/dash/.local,镜像 < 120 MB。最后一行 USER 1000:1000,确保容器内无 root。
步骤二:Compose 模板
docker-compose.yml 用 extends 抽公共配置,每个用户动态生成一份 docker-compose.user.yml,只改容器名和 labels:
services:
dash-${USER_ID}:
image: mydash:1.3.0
user: "${HOST_UID}:${HOST_GID}" # 宿主机当前用户
read_only: true # 根文件系统只读
tmpfs:
- /tmp:size=100M,mode=1777,noexec,nosuid
environment:
- USER_ID=${USER_ID}
- JWT_SECRET_FILE=/run/secrets/jwt
secrets:
- jwt
labels:
- "traefik.http.routers.dash-${USER_ID}.rule=HeadersRegexp(User-Token, ${USER_TOKEN})"
通过 Traefik 的 HeadersRegexp 把用户 Token 路由到专属容器,实现“零修改 Dash 代码”的硬隔离。
步骤三:Dash 侧加固
在 app.py 顶部加 before_request 钩子,把 flask.session['user_id'] 与环境变量 USER_ID 强校验,不一致直接 403;回调函数统一加 @require_same_user 装饰器,阻断跨用户数据泄露。
步骤四:生命周期管理
写一行 systemd 模板 dash@.service,用 %i 传 USER_ID,systemctl start dash@10086 即可拉起容器;停机 30 分钟无请求后,systemd 自动 stop,单节点可支撑 2k 并发用户,内存占用 < 45 MB/实例。
步骤五:等保合规
镜像 push 到国内私有 Harbor,开启镜像签名与漏洞扫描;容器日志走 stdout 直接进 Loki,不落本地文件,满足等保 2.0 对“审计数据防篡改”要求。
拓展思考
- Serverless 化:把上述模型搬到阿里云 ACK/腾讯云 TKE,用 Knative 把 Dash 容器缩容到 0,冷启动 < 3 秒,按毫秒计费,适合教育行业晚高峰突刺场景。
- WebSocket 多路复用:Dash 3.0 已支持
pages/多页,可把多个用户会话复用到同一容器,通过子路径 + JWT 做软隔离,密度提升 5 倍,但需自行解决内存泄漏,适合预算紧张的初创公司。 - GPU 隔离:如果 Dash 加载 PyTorch 做实时推理,可用 NVIDIA MIG 把 A100 切成 7 个 5GB 实例,再配 cgroup v2 的 memory.high,防止某用户把 GPU 显存打爆,这是金融量化客户最在意的点。