# 单容器镜像:一个 deno compile 出的 umt-server 二进制,同时承担 API(含 web 静态 SPA)与 worker。 # PostgreSQL 不在本镜像内,见 docker-compose.yml。 # 构建:docker build -t uhd-media-tool . 运行时版本锁定 Deno 2.9.7(ADR-004) FROM denoland/deno:2.9.7 AS build WORKDIR /src COPY . . RUN deno install --frozen ARG APP_VERSION="" ENV APP_VERSION=${APP_VERSION} RUN deno task check:tokens && cd apps/web && deno task build # --node-modules-dir=none + --exclude-unused-npm:只嵌入 server 依赖图可达的 npm 包(约 110 MB,而不是整个 node_modules) # 权限在编译时固定:--allow-read 只放 /app;不给 --allow-run / --allow-write RUN cd apps/server && deno task compile FROM debian:trixie-slim # 不装额外包:Deno 自带 Mozilla 根证书(外呼 HTTPS 不依赖 ca-certificates),健康探测用二进制自身的 fetch RUN useradd --system --uid 10001 --home-dir /app --shell /usr/sbin/nologin umt WORKDIR /app COPY --from=build --chown=root:root /src/dist/umt-server /app/umt-server COPY --from=build --chown=root:root /src/apps/web/build/client /app/public COPY --chown=root:root --chmod=0755 docker/entrypoint.sh /app/entrypoint.sh ENV NODE_ENV=production \ HOST=0.0.0.0 \ PORT=4380 \ WEB_ROOT=/app/public USER umt EXPOSE 4380 # 用二进制自带的 fetch 打本机回环端口,不装 curl HEALTHCHECK --interval=15s --timeout=5s --start-period=20s --retries=3 CMD ["/app/umt-server", "--role", "probe"] ENTRYPOINT ["/app/entrypoint.sh"]