在 Dash 容器内实现多用户会话隔离

解读

面试官问“在 Dash 容器内实现多用户会话隔离”,表面看是 Python Web 框架 Dash 的多租户问题,实质考察的是容器化场景下如何把“进程级隔离”升级为“用户级隔离”。国内主流做法不是改 Dash 源码,而是用 Docker 层能力把“用户身份”映射到“容器身份”,再辅以 Dash 自身的回调上下文过滤,实现轻量级、可横向扩展的 SaaS 隔离。回答时要体现“镜像最小化、无状态、秒级扩缩容、符合等保”这些国内甲方硬性指标。

知识点

  1. Linux UID/GID 映射:容器内非 root 运行 Dash,宿主机通过 --user $(id -u):$(id -g) 把宿主机用户映射进容器,防止容器逃逸
  2. tmpfs + Overlay2:把 Dash 上传的临时文件挂到 tmpfs 并启用 overlay2index=on实现用户级写时复制隔离,重启即清,符合等保“数据不落地”要求。
  3. Dash 回调上下文:利用 flask.gsession[_user_id] 在回调链最前端加装饰器,把用户身份注入到每次 Plotly 请求,阻断跨用户越权。
  4. Docker Compose 多实例:同一镜像启多个容器,通过 labels 把 user_id 与容器名绑定,再挂到统一 Traefik 路由,实现“单镜像、多容器、每用户一个实例”,秒级横向扩容。
  5. Secret 与 Env 分离:把数据库连接串、JWT 密钥放在 Docker Swarm Secret 或 K8s Secret,禁止写进镜像层,满足国内《个人信息保护法》对密钥 rotation 的审计要求。
  6. 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.ymlextends 抽公共配置,每个用户动态生成一份 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_IDsystemctl start dash@10086 即可拉起容器;停机 30 分钟无请求后,systemd 自动 stop单节点可支撑 2k 并发用户,内存占用 < 45 MB/实例

步骤五:等保合规
镜像 push 到国内私有 Harbor,开启镜像签名与漏洞扫描;容器日志走 stdout 直接进 Loki不落本地文件,满足等保 2.0 对“审计数据防篡改”要求。

拓展思考

  1. Serverless 化:把上述模型搬到阿里云 ACK/腾讯云 TKE,用 Knative 把 Dash 容器缩容到 0冷启动 < 3 秒按毫秒计费,适合教育行业晚高峰突刺场景。
  2. WebSocket 多路复用:Dash 3.0 已支持 pages/ 多页,可把多个用户会话复用到同一容器通过子路径 + JWT 做软隔离密度提升 5 倍,但需自行解决内存泄漏,适合预算紧张的初创公司
  3. GPU 隔离:如果 Dash 加载 PyTorch 做实时推理,可用 NVIDIA MIG 把 A100 切成 7 个 5GB 实例再配 cgroup v2 的 memory.high防止某用户把 GPU 显存打爆这是金融量化客户最在意的点