c45e58c732
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
55 lines
1.8 KiB
Docker
55 lines
1.8 KiB
Docker
# syntax=docker/dockerfile:1
|
||
# BÜTÇEM — çok aşamalı üretim imajı (Next.js standalone çıktı).
|
||
# Build: docker build --build-arg APP_COMMIT=$(git rev-parse --short HEAD) -t butcem .
|
||
# Çalıştır: docker run -p 3000:3000 --env-file .env.production -v butcem-uploads:/app/uploads butcem
|
||
|
||
ARG NODE_VERSION=26
|
||
|
||
# 1) Bağımlılıklar — yalnızca lock dosyası değişince yeniden çalışır.
|
||
FROM node:${NODE_VERSION}-alpine AS deps
|
||
WORKDIR /app
|
||
RUN apk add --no-cache libc6-compat
|
||
COPY package.json package-lock.json ./
|
||
RUN npm ci --no-audit --no-fund
|
||
|
||
# 2) Build
|
||
FROM node:${NODE_VERSION}-alpine AS builder
|
||
WORKDIR /app
|
||
ARG APP_VERSION=""
|
||
ARG APP_COMMIT="unknown"
|
||
ENV NEXT_TELEMETRY_DISABLED=1 \
|
||
APP_VERSION=${APP_VERSION} \
|
||
APP_COMMIT=${APP_COMMIT}
|
||
COPY --from=deps /app/node_modules ./node_modules
|
||
COPY . .
|
||
RUN npm run build
|
||
|
||
# 3) Çalışma zamanı — yalnızca standalone çıktı, root olmayan kullanıcı.
|
||
FROM node:${NODE_VERSION}-alpine AS runner
|
||
WORKDIR /app
|
||
ARG APP_VERSION=""
|
||
ARG APP_COMMIT="unknown"
|
||
ENV NODE_ENV=production \
|
||
NEXT_TELEMETRY_DISABLED=1 \
|
||
PORT=3000 \
|
||
HOSTNAME=0.0.0.0 \
|
||
UPLOAD_DIR=/app/uploads \
|
||
APP_VERSION=${APP_VERSION} \
|
||
APP_COMMIT=${APP_COMMIT}
|
||
|
||
RUN addgroup -S -g 1001 nodejs && adduser -S -u 1001 -G nodejs nextjs \
|
||
&& mkdir -p /app/uploads && chown nextjs:nodejs /app/uploads
|
||
|
||
COPY --from=builder --chown=nextjs:nodejs /app/public ./public
|
||
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
||
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
||
|
||
USER nextjs
|
||
VOLUME ["/app/uploads"]
|
||
EXPOSE 3000
|
||
|
||
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
|
||
CMD node -e "fetch('http://127.0.0.1:'+(process.env.PORT||3000)+'/api/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"
|
||
|
||
CMD ["node", "server.js"]
|