Next.js Discord

Discord Forum

I am facing issue that my .env file is not being loaded in production environment.

Unanswered
Russian Blue posted this in #help-forum
Open in Discord
Russian BlueOP
# Production Dockerfile for  Dashboard - x86_64 ONLY
# For deployment on x86_64 servers (AWS, GCP, Azure, etc.)

# Stage 1: Builder
FROM --platform=linux/amd64 node:20-alpine AS builder

WORKDIR /build

# Copy source from qck-dashboard directory
COPY ./dashboard/package.json ./dashboard/pnpm-lock.yaml ./

# Install pnpm and dependencies
RUN npm install -g pnpm && pnpm install --frozen-lockfile

# Copy application code
COPY ./dashboard/ ./

# Copy staging env file as .env.local for Next.js build
# Next.js will automatically read .env.local during build
COPY ./.env.staging .env.local

# Build Next.js with standalone output
ENV NEXT_TELEMETRY_DISABLED=1
RUN pnpm run build

# Remove .env.local after build (not needed in runtime)
RUN rm -f .env.local

# Stage 2: Distroless runtime - x86_64
FROM --platform=linux/amd64 gcr.io/distroless/nodejs20-debian12:nonroot

WORKDIR /app

# Copy standalone build from builder
COPY --from=builder --chown=nonroot:nonroot /build/.next/standalone ./
COPY --from=builder --chown=nonroot:nonroot /build/.next/static ./.next/static
COPY --from=builder --chown=nonroot:nonroot /build/public ./public

# Environment
ENV NODE_ENV=production
ENV PORT=3000
ENV HOSTNAME=0.0.0.0

EXPOSE 3000

# Run as nonroot user
USER nonroot

# Start Next.js
CMD ["server.js"]

3 Replies

@Russian Blue markdown # Production Dockerfile for Dashboard - x86_64 ONLY # For deployment on x86_64 servers (AWS, GCP, Azure, etc.) # Stage 1: Builder FROM --platform=linux/amd64 node:20-alpine AS builder WORKDIR /build # Copy source from qck-dashboard directory COPY ./dashboard/package.json ./dashboard/pnpm-lock.yaml ./ # Install pnpm and dependencies RUN npm install -g pnpm && pnpm install --frozen-lockfile # Copy application code COPY ./dashboard/ ./ # Copy staging env file as .env.local for Next.js build # Next.js will automatically read .env.local during build COPY ./.env.staging .env.local # Build Next.js with standalone output ENV NEXT_TELEMETRY_DISABLED=1 RUN pnpm run build # Remove .env.local after build (not needed in runtime) RUN rm -f .env.local # Stage 2: Distroless runtime - x86_64 FROM --platform=linux/amd64 gcr.io/distroless/nodejs20-debian12:nonroot WORKDIR /app # Copy standalone build from builder COPY --from=builder --chown=nonroot:nonroot /build/.next/standalone ./ COPY --from=builder --chown=nonroot:nonroot /build/.next/static ./.next/static COPY --from=builder --chown=nonroot:nonroot /build/public ./public # Environment ENV NODE_ENV=production ENV PORT=3000 ENV HOSTNAME=0.0.0.0 EXPOSE 3000 # Run as nonroot user USER nonroot # Start Next.js CMD ["server.js"]
# Remove .env.local after build (not needed in runtime)
RUN rm -f .env.local


well, environment variables are needed in runtime. you need to ensure that either an .env* file exists in runtime, or that runtime otherwise already has all environment variables configured
Russian BlueOP
@joulev let me give you bigger picture

project
-> dashboard/ nextjs project
-> backend/ some other API project
-> .env.staging
-> .env
-> dockerfiles/dockerfile.dashboard
-> dockerfiles/dockerfile.backend
-> docker-compose.yml

dockerfile.dashboard contains what i sent first

.env has everything even NEXTPUBLIC** variables

here is docker-compose.yml

  dashboard:
    build:
      context: .
      dockerfile: ./dockerfiles/Dockerfile.dashboard
    container_name: dashboard
    platform: linux/amd64
    ports:
      - "10111:3000"
    # Load all environment variables from .env file
    env_file:
      - .env.staging # or .env 
    environment:
      - NODE_ENV=production
      - NEXTAUTH_URL=${NEXTAUTH_URL_DASHBOARD}
      - NEXTAUTH_SECRET=${NEXTAUTH_SECRET_DASHBOARD}

    depends_on:
      - qck-api-staging
    
    networks:
      - qck-network-staging
    
    restart: unless-stopped