Skip to content

Docker 部署

🐳 用 Docker 运行 snir,内置 Chromium。

snir 提供多阶段 Dockerfile,运行时镜像基于 alpine + chromium。

构建与运行阶段的关系:

容器运行时,snir 与内置 Chromium、挂载卷的协作时序:

Dockerfile 概览

dockerfile
# 构建阶段:golang:1.23-alpine → 交叉编译 snir
# 运行阶段:alpine:3.21 + chromium

关键点:

  • 🏗️ 多阶段构建,最终镜像小
  • 🌐 内置 chromium,无需另装 Chrome
  • 🌍 ENV CHROME_BIN=/usr/bin/chromium-browserCHROME_PATH=/usr/lib/chromium/
  • 🚪 EXPOSE 8080(API)
  • ❤️ HEALTHCHECK/health
  • 🚀 ENTRYPOINT ["/app/snir"]CMD ["serve"]

docker-compose

yaml
services:
  snir:
    build: .
    container_name: go-snir
    ports:
      - "8080:8080"
    volumes:
      - ./data:/app/data
    restart: unless-stopped
    command: ["serve"]

使用

bash
# 构建并启动
docker compose up -d

# 或手动
docker build -t snir .
docker run --rm -p 8080:8080 -v $(pwd)/data:/app/data snir serve

# 跑截图
docker run --rm -v $(pwd)/data:/app/data snir scan example.com

# 启动 API
docker run --rm -p 8080:8080 -v $(pwd)/data:/app/data snir api --api-key secret

数据卷

挂载 ./data:/app/data 持久化截图、SQLite、JSONL。

注意

容器内 Chrome 必须关沙箱

alpine 容器内默认以 root 运行,Chromium 的 sandbox 在此环境下会报 No usable sandbox! 而崩溃。snir 在容器内已自动追加 --no-sandbox

  • ✅ 容器内可放心使用 --no-sandbox(容器本身就是隔离边界)
  • 宿主机直跑切勿 --no-sandbox,会降低安全性,请改用专用用户 + sandbox

容器网络与资源

  • 🌐 访问内网目标时,容器默认 bridge 网络可能无法到达宿主机内网——用 --network host 或自定义网络
  • 🧠 大批量采集(数百/上千 URL)调大 mem_limit--threads,否则容器 OOM 被杀
  • 💾 数据卷 ./data:/app/data 必须挂载,否则容器重建后截图/SQLite 全丢

下一步

基于 MIT 许可发布