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