diff --git a/docs/site/content/docs/guides/tools/docker.mdx b/docs/site/content/docs/guides/tools/docker.mdx index 8d8fd96299e5f..c1236cbe3dbf5 100644 --- a/docs/site/content/docs/guides/tools/docker.mdx +++ b/docs/site/content/docs/guides/tools/docker.mdx @@ -142,48 +142,51 @@ docker build -f apps/web/Dockerfile . ```docker title="./apps/web/Dockerfile" FROM node:18-alpine AS base - -FROM base AS builder RUN apk update RUN apk add --no-cache libc6-compat # Set working directory WORKDIR /app + +# --- +FROM base AS prepare # Replace with the major version installed in your repository. For example: # RUN yarn global add turbo@^2 RUN yarn global add turbo@^ COPY . . - +# Add lockfile and package.json's of isolated subworkspace # Generate a partial monorepo with a pruned lockfile for a target workspace. # Assuming "web" is the name entered in the project's package.json: { name: "web" } RUN turbo prune web --docker -# Add lockfile and package.json's of isolated subworkspace -FROM base AS installer -RUN apk update -RUN apk add --no-cache libc6-compat -WORKDIR /app - +# --- +FROM base AS builder # First install the dependencies (as they change less often) -COPY --from=builder /app/out/json/ . -RUN yarn install --frozen-lockfile - +COPY --from=prepare /app/out/json/ . +RUN yarn install # Build the project -COPY --from=builder /app/out/full/ . -RUN yarn turbo run build +COPY --from=prepare /app/out/full/ . -FROM base AS runner -WORKDIR /app +# Uncomment and use build args to enable remote caching +# ARG TURBO_TEAM +# ENV TURBO_TEAM=$TURBO_TEAM + +# ARG TURBO_TOKEN +# ENV TURBO_TOKEN=$TURBO_TOKEN -# Don't run production as root +RUN yarn turbo build + +# --- +FROM base AS runner +# Don't run production as root for security reasons RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs USER nextjs # Automatically leverage output traces to reduce image size # https://nextjs.org/docs/advanced-features/output-file-tracing -COPY --from=installer --chown=nextjs:nodejs /app/apps/web/.next/standalone ./ -COPY --from=installer --chown=nextjs:nodejs /app/apps/web/.next/static ./apps/web/.next/static -COPY --from=installer --chown=nextjs:nodejs /app/apps/web/public ./apps/web/public +COPY --from=builder --chown=nextjs:nodejs /app/apps/web/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/apps/web/.next/static ./apps/web/.next/static +COPY --from=builder --chown=nextjs:nodejs /app/apps/web/public ./apps/web/public CMD node apps/web/server.js ``` diff --git a/examples/with-docker/apps/web/Dockerfile b/examples/with-docker/apps/web/Dockerfile index 158fe5d66e4cc..9bd50176f1162 100644 --- a/examples/with-docker/apps/web/Dockerfile +++ b/examples/with-docker/apps/web/Dockerfile @@ -3,28 +3,26 @@ FROM node:18-alpine AS base # This Dockerfile is copy-pasted into our main docs at /docs/handbook/deploying-with-docker. # Make sure you update both files! -FROM base AS builder # Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. RUN apk update RUN apk add --no-cache libc6-compat # Set working directory WORKDIR /app + +# --- +FROM base AS prepare RUN yarn global add turbo COPY . . -RUN turbo prune web --docker - # Add lockfile and package.json's of isolated subworkspace -FROM base AS installer -RUN apk update -RUN apk add --no-cache libc6-compat -WORKDIR /app +RUN turbo prune web --docker +# --- +FROM base AS builder # First install the dependencies (as they change less often) -COPY --from=builder /app/out/json/ . +COPY --from=prepare /app/out/json/ . RUN yarn install - # Build the project -COPY --from=builder /app/out/full/ . +COPY --from=prepare /app/out/full/ . # Uncomment and use build args to enable remote caching # ARG TURBO_TEAM @@ -35,18 +33,17 @@ COPY --from=builder /app/out/full/ . RUN yarn turbo build +# --- FROM base AS runner -WORKDIR /app - -# Don't run production as root +# Don't run production as root for security reasons RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs USER nextjs # Automatically leverage output traces to reduce image size # https://nextjs.org/docs/advanced-features/output-file-tracing -COPY --from=installer --chown=nextjs:nodejs /app/apps/web/.next/standalone ./ -COPY --from=installer --chown=nextjs:nodejs /app/apps/web/.next/static ./apps/web/.next/static -COPY --from=installer --chown=nextjs:nodejs /app/apps/web/public ./apps/web/public +COPY --from=builder --chown=nextjs:nodejs /app/apps/web/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/apps/web/.next/static ./apps/web/.next/static +COPY --from=builder --chown=nextjs:nodejs /app/apps/web/public ./apps/web/public CMD node apps/web/server.js