From 7e4ca02f9f8b7230294e850156c35ff95e611348 Mon Sep 17 00:00:00 2001 From: Ameer Date: Tue, 22 Apr 2025 13:05:37 +0530 Subject: [PATCH 1/2] penguin-dockerized-app --- .dockerignore | 40 +++++++++++++++++++++++++++++++ Dockerfile | 54 +++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 60 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 4 +++- 4 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 docker-compose.yml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..937bc58 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,40 @@ +# Version control +.git +.github +.gitignore + +# Dependencies +node_modules +npm-debug.log +yarn-debug.log +yarn-error.log + +# Environment +.env.local +.env.development.local +.env.test.local +.env.production.local +.env + +# Next.js build output +.next/cache + +# Testing +coverage +__tests__ +*.test.js +*.spec.js + +# Development files +README.md +*.md +.editorconfig +.eslintrc +.prettierrc +.vscode +docs + +# OS specific +.DS_Store +Thumbs.db +*.swp \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..038a504 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,54 @@ +# Stage 1: Dependencies +FROM node:18-alpine AS deps + +# Set working directory +WORKDIR /app + +# Copy package files first for better caching +COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./ + +# Install dependencies based on the lockfile +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 --frozen-lockfile; \ + else echo "Lockfile not found." && exit 1; \ + fi + +# Stage 2: Build the application +FROM node:18-alpine AS builder + +# Set working directory +WORKDIR /app + +# Copy dependencies from deps stage +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +# Build the application +RUN npm run build + +# Stage 3: Production image +FROM node:18-alpine 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 built assets from builder +COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next +COPY --from=builder --chown=nextjs:nodejs /app/node_modules ./node_modules +COPY --from=builder --chown=nextjs:nodejs /app/package.json ./package.json +COPY --from=builder --chown=nextjs:nodejs /app/public ./public + +# Next.js collects completely anonymous telemetry data +ENV NEXT_TELEMETRY_DISABLED 1 + +# Expose port and start the application +EXPOSE 3000 +ENV PORT 3000 +ENV NODE_ENV production + +CMD ["npm", "start"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..8ebdca8 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,60 @@ +version: "3.8" + +services: + # Development service + nextjs-dev: + build: + context: . + target: deps + dockerfile: Dockerfile + volumes: + - app-code:/app + - /app/node_modules + - /app/.next + ports: + - "3000:3000" + environment: + - NODE_ENV=development + - WATCHPACK_POLLING=true + - CHOKIDAR_USEPOLLING=true + - NEXT_WEBPACK_POLLING=true + command: npm run dev + profiles: ["dev"] + # Add these settings for better file watching + init: true + stdin_open: true + tty: true + + # Production service + nextjs-prod: + build: + context: . + target: runner + dockerfile: Dockerfile + restart: unless-stopped + ports: + - "3000:3000" + environment: + - NODE_ENV=production + profiles: ["prod"] + +volumes: + app-code: + driver: local + driver_opts: + type: none + o: bind + device: ${PWD} + + # Add additional services as needed (database, redis, etc.) + # db: + # image: postgres:14 + # volumes: + # - postgres_data:/var/lib/postgresql/data + # environment: + # - POSTGRES_PASSWORD=postgres + # - POSTGRES_USER=postgres + # - POSTGRES_DB=nextjs + # profiles: ["dev", "prod"] # Available in both environments +# volumes: +# postgres_data: diff --git a/package.json b/package.json index 0307c4d..3165f59 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,9 @@ "dev": "next dev", "build": "next build", "start": "next start", - "lint": "next lint" + "lint": "next lint", + "docker:dev": "docker-compose --profile dev up", + "docker:prod": "docker-compose --profile prod up -d" }, "dependencies": { "@emailjs/browser": "^4.4.1", From d20fd3afc71237b906032df1ac28848b6c4f01c8 Mon Sep 17 00:00:00 2001 From: Ameer Date: Tue, 22 Apr 2025 13:10:01 +0530 Subject: [PATCH 2/2] removed unused postgres docoker service --- docker-compose.yml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 8ebdca8..f37af7a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -45,16 +45,3 @@ volumes: type: none o: bind device: ${PWD} - - # Add additional services as needed (database, redis, etc.) - # db: - # image: postgres:14 - # volumes: - # - postgres_data:/var/lib/postgresql/data - # environment: - # - POSTGRES_PASSWORD=postgres - # - POSTGRES_USER=postgres - # - POSTGRES_DB=nextjs - # profiles: ["dev", "prod"] # Available in both environments -# volumes: -# postgres_data: