fix: review docker for prod version

This commit is contained in:
Julien Froidefond
2025-03-06 08:16:27 +01:00
parent dd2be14bff
commit 5f759b5d8f
3 changed files with 100 additions and 23 deletions

View File

@@ -4,17 +4,25 @@ FROM node:20-alpine AS builder
# Set working directory # Set working directory
WORKDIR /app WORKDIR /app
# Install dependencies for node-gyp
RUN apk add --no-cache python3 make g++
# Enable Yarn # Enable Yarn
RUN corepack enable RUN corepack enable
# Copy package files # Copy package files first to leverage Docker cache
COPY package.json yarn.lock* ./ COPY package.json yarn.lock ./
# Copy configuration files
COPY tsconfig.json next-env.d.ts .eslintrc.json ./
COPY tailwind.config.ts postcss.config.js .env ./
# Install dependencies with Yarn # Install dependencies with Yarn
RUN yarn install --frozen-lockfile RUN yarn install --frozen-lockfile
# Copy the rest of the application # Copy source files
COPY . . COPY src ./src
COPY public ./public
# Build the application # Build the application
RUN yarn build RUN yarn build
@@ -24,16 +32,25 @@ FROM node:20-alpine AS runner
WORKDIR /app WORKDIR /app
# Enable Yarn # Install production dependencies only
RUN corepack enable COPY package.json yarn.lock ./
RUN corepack enable && \
# Copy package files and install production dependencies only yarn install --production --frozen-lockfile && \
COPY package.json yarn.lock* ./ yarn cache clean
RUN yarn install --production --frozen-lockfile
# Copy built application from builder stage # Copy built application from builder stage
COPY --from=builder /app/.next ./.next COPY --from=builder /app/.next ./.next
COPY --from=builder /app/public ./public COPY --from=builder /app/public ./public
COPY --from=builder /app/next-env.d.ts ./
COPY --from=builder /app/tailwind.config.ts ./
COPY --from=builder /app/.env ./
# Add non-root user for security
RUN addgroup --system --gid 1001 nodejs && \
adduser --system --uid 1001 nextjs && \
chown -R nextjs:nodejs /app
USER nextjs
# Set environment variables # Set environment variables
ENV NODE_ENV=production ENV NODE_ENV=production
@@ -42,5 +59,9 @@ ENV NEXT_TELEMETRY_DISABLED=1
# Expose the port the app runs on # Expose the port the app runs on
EXPOSE 3000 EXPOSE 3000
# Start the application in production mode # Healthcheck
HEALTHCHECK --interval=30s --timeout=3s \
CMD wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1
# Start the application
CMD ["yarn", "start"] CMD ["yarn", "start"]

32
docker-compose.dev.yml Normal file
View File

@@ -0,0 +1,32 @@
version: "3.8"
services:
app:
build:
context: .
dockerfile: Dockerfile
container_name: stripstream-app
ports:
- "3000:3000"
volumes:
- .:/app
- /app/node_modules
- /app/.next
environment:
- NODE_ENV=development
command: npm run dev
mongodb:
image: mongo:latest
container_name: stripstream_mongodb
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_USER}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD}
ports:
- "27017:27017"
volumes:
- mongodb_data:/data/db
volumes:
mongodb_data:

View File

@@ -5,28 +5,52 @@ services:
build: build:
context: . context: .
dockerfile: Dockerfile dockerfile: Dockerfile
args:
- NODE_ENV=production
container_name: stripstream-app container_name: stripstream-app
restart: unless-stopped
ports: ports:
- "3000:3000" - "3000:3000"
volumes:
- .:/app
- /app/node_modules
- /app/.next
environment: environment:
- NODE_ENV=development - NODE_ENV=production
command: npm run dev - MONGODB_URI=mongodb://${MONGO_USER}:${MONGO_PASSWORD}@mongodb:27017/stripstream?authSource=admin
depends_on:
- mongodb
networks:
- stripstream-network
deploy:
resources:
limits:
cpus: "1"
memory: 1G
healthcheck:
test:
["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/api/health"]
interval: 30s
timeout: 3s
retries: 3
mongodb: mongodb:
image: mongo:latest image: mongo:latest
container_name: stripstream_mongodb container_name: stripstream-mongodb
restart: always restart: unless-stopped
environment: environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_USER} MONGO_INITDB_ROOT_USERNAME: ${MONGO_USER}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD} MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD}
ports:
- "27017:27017"
volumes: volumes:
- mongodb_data:/data/db - stripstream_mongodb_data:/data/db
networks:
- stripstream-network
deploy:
resources:
limits:
cpus: "0.5"
memory: 512M
command: ["mongod", "--auth", "--bind_ip_all"]
networks:
stripstream-network:
driver: bridge
volumes: volumes:
mongodb_data: stripstream_mongodb_data: