Created
November 27, 2023 03:19
-
-
Save p77u4n/14587803f5eaa8619bf3a050ce6a0cb1 to your computer and use it in GitHub Desktop.
Dockerfile
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
FROM node:18-alpine AS base | |
# Step 1. Rebuild the source code only when needed | |
FROM base AS builder | |
WORKDIR /app | |
# Install dependencies based on the preferred package manager | |
COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./ | |
# Omit --production flag for TypeScript devDependencies | |
RUN \ | |
if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ | |
elif [ -f package-lock.json ]; then npm ci; \ | |
elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i; \ | |
# Allow install without lockfile, so example works even without Node.js installed locally | |
else echo "Warning: Lockfile not found. It is recommended to commit lockfiles to version control." && yarn install; \ | |
fi | |
COPY src ./src | |
COPY public ./public | |
COPY next.config.js . | |
COPY tsconfig.json . | |
# Environment variables must be present at build time | |
# https://github.com/vercel/next.js/discussions/14030 | |
ARG ENV_VARIABLE | |
ENV ENV_VARIABLE=${ENV_VARIABLE} | |
ARG NEXT_PUBLIC_ENV_VARIABLE | |
ENV NEXT_PUBLIC_ENV_VARIABLE=${NEXT_PUBLIC_ENV_VARIABLE} | |
ENV NODE_ENV="production" | |
# Next.js collects completely anonymous telemetry data about general usage. Learn more here: https://nextjs.org/telemetry | |
# Uncomment the following line to disable telemetry at build time | |
# ENV NEXT_TELEMETRY_DISABLED 1 | |
# Build Next.js based on the preferred package manager | |
RUN \ | |
if [ -f yarn.lock ]; then yarn build; \ | |
elif [ -f package-lock.json ]; then npm run build; \ | |
elif [ -f pnpm-lock.yaml ]; then pnpm build; \ | |
else yarn build; \ | |
fi | |
# Note: It is not necessary to add an intermediate step that does a full copy of `node_modules` here | |
# Step 2. Production image, copy all the files and run next | |
FROM base AS runner | |
WORKDIR /app | |
# Don't run production as root | |
RUN addgroup --system --gid 1001 nodejs | |
RUN adduser --system --uid 1001 nextjs | |
USER nextjs | |
COPY --from=builder /app/public ./public | |
# Automatically leverage output traces to reduce image size | |
# https://nextjs.org/docs/advanced-features/output-file-tracing | |
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ | |
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static | |
# Environment variables must be redefined at run time | |
ARG ENV_VARIABLE | |
ENV ENV_VARIABLE=${ENV_VARIABLE} | |
ARG NEXT_PUBLIC_ENV_VARIABLE | |
ENV NEXT_PUBLIC_ENV_VARIABLE=${NEXT_PUBLIC_ENV_VARIABLE} | |
# Uncomment the following line to disable telemetry at run time | |
# ENV NEXT_TELEMETRY_DISABLED 1 | |
# Note: Don't expose ports here, Compose will handle that for us | |
CMD ["node", "server.js"] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment