64 lines
1.8 KiB
Docker
64 lines
1.8 KiB
Docker
# ==================================================
|
||
# EchoChat media-server Dockerfile(多阶段构建)
|
||
# 基础镜像:node:20-bookworm-slim(mediasoup 构建需要 python3 + g++)
|
||
# ==================================================
|
||
|
||
# ---------------- Stage 1: builder ----------------
|
||
FROM node:20-bookworm-slim AS builder
|
||
|
||
ENV DEBIAN_FRONTEND=noninteractive
|
||
RUN apt-get update \
|
||
&& apt-get install -y --no-install-recommends \
|
||
python3 \
|
||
python3-pip \
|
||
build-essential \
|
||
pkg-config \
|
||
ca-certificates \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
|
||
WORKDIR /app
|
||
|
||
COPY package.json package-lock.json* ./
|
||
RUN --mount=type=cache,target=/root/.npm \
|
||
if [ -f package-lock.json ]; then npm ci; else npm install; fi
|
||
|
||
COPY tsconfig.json tsconfig.build.json ./
|
||
COPY src ./src
|
||
|
||
RUN npm run build
|
||
|
||
# 裁掉 devDependencies,只保留运行时依赖
|
||
RUN npm prune --omit=dev
|
||
|
||
# ---------------- Stage 2: runtime ----------------
|
||
FROM node:20-bookworm-slim AS runtime
|
||
|
||
ENV NODE_ENV=production \
|
||
LOG_PRETTY=false \
|
||
HTTP_HOST=0.0.0.0 \
|
||
HTTP_PORT=3300
|
||
|
||
# mediasoup-worker 是原生二进制,运行时需要 libstdc++ 等基础库,slim 默认已包含
|
||
# 健康检查需要 curl
|
||
RUN apt-get update \
|
||
&& apt-get install -y --no-install-recommends curl ca-certificates ffmpeg \
|
||
&& rm -rf /var/lib/apt/lists/* \
|
||
&& useradd --system --create-home --shell /usr/sbin/nologin mediasoup
|
||
|
||
WORKDIR /app
|
||
|
||
COPY --from=builder --chown=mediasoup:mediasoup /app/node_modules ./node_modules
|
||
COPY --from=builder --chown=mediasoup:mediasoup /app/dist ./dist
|
||
COPY --chown=mediasoup:mediasoup package.json ./
|
||
|
||
USER mediasoup
|
||
|
||
EXPOSE 3300
|
||
EXPOSE 40000-40199/udp
|
||
EXPOSE 40000-40199/tcp
|
||
|
||
HEALTHCHECK --interval=10s --timeout=3s --start-period=15s --retries=3 \
|
||
CMD curl -fsS http://127.0.0.1:${HTTP_PORT:-3300}/healthz || exit 1
|
||
|
||
CMD ["node", "dist/app.js"]
|