51 lines
2.0 KiB
Docker
51 lines
2.0 KiB
Docker
# syntax=docker/dockerfile:1
|
|
|
|
# ---- deps: install once, reused by the build stage ----
|
|
FROM node:24-alpine AS deps
|
|
WORKDIR /app
|
|
# Prisma's engine binaries need OpenSSL; libc6-compat smooths over a few
|
|
# other native-module quirks on Alpine.
|
|
RUN apk add --no-cache libc6-compat openssl
|
|
COPY package.json package-lock.json ./
|
|
RUN npm ci
|
|
|
|
# ---- build: generate the Prisma client and compile the Next.js app ----
|
|
FROM node:24-alpine AS build
|
|
WORKDIR /app
|
|
RUN apk add --no-cache openssl
|
|
COPY --from=deps /app/node_modules ./node_modules
|
|
COPY . .
|
|
RUN npx prisma generate
|
|
RUN npm run build
|
|
|
|
# ---- runtime ----
|
|
# Not using Next's `output: "standalone"` here: its dependency tracing
|
|
# only follows what the server bundle imports, so it wouldn't include the
|
|
# Prisma CLI, which this image invokes as a separate process (via
|
|
# docker-entrypoint.sh) to run migrations on every container start. Copying
|
|
# the full node_modules is a simpler, more reliable trade for a
|
|
# single self-hosted instance.
|
|
FROM node:24-alpine AS runtime
|
|
WORKDIR /app
|
|
ENV NODE_ENV=production
|
|
RUN apk add --no-cache openssl
|
|
COPY --from=build /app/node_modules ./node_modules
|
|
COPY --from=build /app/.next ./.next
|
|
COPY --from=build /app/public ./public
|
|
COPY --from=build /app/prisma ./prisma
|
|
COPY --from=build /app/lib ./lib
|
|
COPY --from=build /app/prisma.config.ts ./prisma.config.ts
|
|
COPY --from=build /app/package.json ./package.json
|
|
COPY --from=build /app/next.config.ts ./next.config.ts
|
|
COPY docker-entrypoint.sh ./docker-entrypoint.sh
|
|
# Strip any CRLF line endings before making it executable -- a CRLF
|
|
# shebang (e.g. from a Windows checkout without .gitattributes honoring
|
|
# `eol=lf`) makes the kernel look for a literal "/bin/sh\r" interpreter,
|
|
# which fails with a misleading "no such file or directory" at container
|
|
# startup. This keeps the image correct even if the checkout wasn't.
|
|
RUN sed -i 's/\r$//' docker-entrypoint.sh && chmod +x docker-entrypoint.sh
|
|
|
|
EXPOSE 3000
|
|
ENTRYPOINT ["./docker-entrypoint.sh"]
|
|
CMD ["npm", "run", "start"]
|