69 lines
2.5 KiB
Docker
69 lines
2.5 KiB
Docker
# Monorepo: pnpm + Turbo,仅构建 apps/web
|
||
FROM node:20-bookworm-slim AS builder
|
||
|
||
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
||
apt-get update \
|
||
&& apt-get install -y --no-install-recommends openssl ca-certificates
|
||
|
||
WORKDIR /app
|
||
|
||
RUN corepack enable && corepack prepare pnpm@9.15.9 --activate
|
||
ENV PNPM_HOME="/pnpm"
|
||
ENV PATH="$PNPM_HOME:$PATH"
|
||
|
||
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml turbo.json ./
|
||
COPY apps/web/package.json ./apps/web/
|
||
COPY packages/ui/package.json ./packages/ui/
|
||
COPY packages/shopify-admin/package.json ./packages/shopify-admin/
|
||
|
||
RUN --mount=type=cache,id=pnpm-store,target=/pnpm/store \
|
||
pnpm config set store-dir /pnpm/store \
|
||
&& pnpm install --frozen-lockfile
|
||
|
||
COPY apps/web ./apps/web
|
||
COPY packages ./packages
|
||
|
||
ENV TURBO_TELEMETRY_DISABLED=1
|
||
RUN --mount=type=cache,id=turbo-cache,target=/app/node_modules/.cache/turbo \
|
||
pnpm turbo build --filter=web
|
||
|
||
# 产出仅含 web 生产依赖的独立部署目录(比 runner 内 monorepo install 更小)
|
||
RUN pnpm --filter=web deploy --prod /app/deploy
|
||
|
||
# prisma CLI 为 devDep:用 web 包内已安装的 prisma 在 deploy 目录 generate
|
||
RUN --mount=type=cache,id=prisma-cache,target=/root/.cache/prisma \
|
||
pnpm --filter=web exec prisma generate --schema=/app/deploy/prisma/schema.prisma
|
||
|
||
# 运行时不需要源码与构建配置
|
||
RUN rm -rf /app/deploy/app /app/deploy/.turbo /app/deploy/.react-router /app/deploy/components /app/deploy/hooks /app/deploy/lib \
|
||
/app/deploy/vite.config.ts /app/deploy/tsconfig.json /app/deploy/components.json /app/deploy/react-router.config.ts \
|
||
/app/deploy/Dockerfile /app/deploy/.dockerignore
|
||
|
||
# 运行镜像:deploy 产物 + 全局 prisma CLI(migrate deploy)
|
||
FROM node:20-bookworm-slim AS runner
|
||
|
||
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
||
apt-get update \
|
||
&& apt-get install -y --no-install-recommends openssl ca-certificates
|
||
|
||
RUN --mount=type=cache,id=npm-cache,target=/root/.npm \
|
||
npm install -g prisma@6.19.0
|
||
|
||
WORKDIR /app
|
||
ENV NODE_ENV=production
|
||
ENV HOST=0.0.0.0
|
||
ENV PORT=3000
|
||
|
||
COPY --from=builder /app/deploy ./
|
||
|
||
COPY docker/docker-entrypoint.sh /docker-entrypoint.sh
|
||
RUN chmod +x /docker-entrypoint.sh
|
||
|
||
EXPOSE 3000
|
||
|
||
HEALTHCHECK --interval=30s --timeout=5s --start-period=40s --retries=3 \
|
||
CMD node -e "fetch('http://127.0.0.1:' + (process.env.PORT || 3000)).then(r => process.exit(r.ok ? 0 : 1)).catch(() => process.exit(1))"
|
||
|
||
ENTRYPOINT ["/docker-entrypoint.sh"] |