Dockerfile 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. # ============================================================
  2. # 鸣鹤 (MingHe) SIP Server — 多阶段构建
  3. # ============================================================
  4. # ---- 阶段 1: 构建 ----
  5. FROM rust:bookworm AS builder
  6. WORKDIR /build
  7. # 先复制依赖清单,利用 Docker 层缓存
  8. COPY Cargo.toml Cargo.lock* ./
  9. # 创建虚拟 main.rs 来预编译依赖
  10. RUN mkdir -p src && \
  11. echo 'fn main() { println!("placeholder"); }' > src/main.rs && \
  12. cargo build --release 2>/dev/null || true && \
  13. rm -rf src
  14. # 复制实际源码并编译
  15. COPY src/ src/
  16. # 触发重新编译(因为 src/main.rs 变了)
  17. RUN touch src/main.rs && \
  18. cargo build --release
  19. # ---- 阶段 2: 运行 ----
  20. FROM debian:bookworm-slim
  21. # 安装最小运行时依赖
  22. RUN apt-get update && \
  23. apt-get install -y --no-install-recommends \
  24. ca-certificates \
  25. && \
  26. rm -rf /var/lib/apt/lists/*
  27. # 创建固定 UID/GID 的非 root 用户,便于宿主机 bind mount 目录授权
  28. RUN groupadd -r -g 10001 minghe && \
  29. useradd -r -u 10001 -g minghe -d /app -s /sbin/nologin minghe
  30. WORKDIR /app
  31. # 从构建阶段复制二进制
  32. COPY --from=builder /build/target/release/minghe /app/minghe
  33. # 创建必要的目录
  34. RUN mkdir -p /app/certs /app/config && \
  35. chown -R minghe:minghe /app
  36. # 默认配置文件(可被卷挂载覆盖)
  37. COPY config.toml /app/config/config.toml
  38. # 切换到非 root 用户
  39. USER minghe
  40. # SIP TLS 端口
  41. EXPOSE 5061/tcp
  42. # RTP 媒体端口范围(默认约 10 通并发)
  43. EXPOSE 20000-20020/udp
  44. # 健康检查:检查进程是否存活
  45. HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
  46. CMD pgrep minghe > /dev/null || exit 1
  47. # 数据卷
  48. VOLUME ["/app/certs", "/app/config"]
  49. # 启动命令
  50. ENTRYPOINT ["/app/minghe"]
  51. CMD ["-c", "/app/config/config.toml"]