title | description | layout | lang |
---|---|---|---|
Docker |
Deployment mit Docker |
../../../layouts/docs.astro |
de |
Der Stack kann mit Docker deployed werden. Entweder als einzelner Container oder als Gruppe von Containern mit docker-compose
. Ein Beispiel lässt sich in dem Repository ajcwebdev/ct3a-docker
finden, welches auf dieser Dokumentation basiert.
Next.js benötigt unterschiedliche Vorgehensweisen für Variablen, die zur "Build time" gesetzt werden (verfügbar im Frontend, gepräfixt durch NEXT_PUBLIC
) und Variablen, die nur serverseitig verfügbar sein sollen. Bitte beachte also die Anordnung der Variablen in der Befehlszeile, der Dockerfile
und der docker-compose.yml
Datei.
DATABASE_URL
(wird vom Server verwendet)NEXT_PUBLIC_CLIENTVAR
(wird vom Client verwendet)
In der next.config.mjs
, muss die output-Option auf standalone
gesetzt werden, um die Größe vom Docker-Image zu reduzieren und Gebrauch von "Output File Tracing" zu machen:
export default defineNextConfig({
reactStrictMode: true,
swcMinify: true,
+ output: "standalone",
});
Klick hier und kopiere den Inhalt in .dockerignore
:
.env
Dockerfile
.dockerignore
node_modules
npm-debug.log
README.md
.next
.git
Da wir die Umgebungsvariablen des Servers nicht in den Container ziehen, wird die Validierung der Umgebungsvariablen fehlschlagen. Um dies zu verhindern, müssen wir dem Build-Befehl
SKIP_ENV_VALIDATION=1
hinzufügen, damit die Umgebungsvariablen-Schemas nicht zur "Build time" validiert werden.
Klick hier und kopiere den Inhalt in Dockerfile
:
##### Abhängigkeiten
FROM --platform=linux/amd64 node:16-alpine AS deps
RUN apk add --no-cache libc6-compat openssl
WORKDIR /app
# Installiere Prisma Client - Entferne diese Zeile wenn du Prisma nicht verwendest
COPY prisma ./
# Installiere die Abhängigkeiten basierend auf dem bevorzugten Paketmanager
COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml\* ./
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; \
else echo "Lockfile not found." && exit 1; \
fi
##### BUILDER
FROM --platform=linux/amd64 node:16-alpine AS builder
ARG DATABASE_URL
ARG NEXT_PUBLIC_CLIENTVAR
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
# ENV NEXT_TELEMETRY_DISABLED 1
RUN \
if [ -f yarn.lock ]; then SKIP_ENV_VALIDATION=1 yarn build; \
elif [ -f package-lock.json ]; then SKIP_ENV_VALIDATION=1 npm run build; \
elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && SKIP_ENV_VALIDATION=1 pnpm run build; \
else echo "Lockfile not found." && exit 1; \
fi
##### RUNNER
FROM --platform=linux/amd64 node:16-alpine AS runner
WORKDIR /app
ENV NODE_ENV production
# ENV NEXT_TELEMETRY_DISABLED 1
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
COPY --from=builder /app/next.config.mjs ./
COPY --from=builder /app/public ./public
COPY --from=builder /app/package.json ./package.json
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
EXPOSE 3000
ENV PORT 3000
CMD ["node", "server.js"]
Notizen
- Emulation von
--platform=linux/amd64
ist gegebenfalls nicht mehr notwendig mit Node 18.- Siehe
node:alpine
um zu verstehen warumlibc6-compat
eventuell benötigt wird.- Next.js erfasst anonyme Daten zur Nutzung. In der obenstehenden
Dockerfile
befinden sich bereits zwei auskommentierte Zeilen mit dem BefehlENV NEXT_TELEMETRY_DISABLED 1
. Entferne die Kommentare der ersten Zeile um die Datenerfassung während des Builds zu deaktivieren. Die zweite Zeile deaktiviert die Datenerfassung zur Laufzeit.
Erstelle und starte das Image lokal mit folgenden Befehlen:
docker build -t ct3a-docker --build-arg NEXT_PUBLIC_CLIENTVAR=clientvar .
docker run -p 3000:3000 -e DATABASE_URL="hier_datenbank_url_einfügen" ct3a-docker
Öffne localhost:3000 um die laufende Anwendung zu sehen.
Du kannst auch Docker Compose verwenden, um deine Anwendung zu starten.
Verfolge die obenstehenden Schritte 1-4, klicke hier und füge den Inhalt in docker-compose.yml
ein:
version: "3.9"
services:
app:
platform: "linux/amd64"
build:
context: .
dockerfile: Dockerfile
args:
NEXT_PUBLIC_CLIENTVAR: "clientvar"
working_dir: /app
ports:
- "3000:3000"
image: t3-app
environment:
- DATABASE_URL=hier_datenbank_url_einfügen
Führe den Befehl docker compose up
aus:
docker compose up
Öffne localhost:3000 um die laufende Anwendung zu sehen.
Du kannst einen PaaS wie Railway's automatisierte Dockerfile deployments verwenden um deine Anwendung zu deployen. Wenn du die Railway CLI installiert hast kannst du deine Anwendung mit folgenden Befehlen deployen:
railway login
railway init
railway link
railway up
railway open
Gehe zu "Variables" und füge deine DATABASE_URL
ein. Anschließend gehe zu "Settings" und wähle "Generate Domain". Um ein laufendes Beispiel auf Railway zu sehen, besuche ct3a-docker.up.railway.app.
Resource | Link |
---|---|
Dockerfile Referenz | https://docs.docker.com/engine/reference/builder/ |
Compose file version 3 Referenz | https://docs.docker.com/compose/compose-file/compose-file-v3/ |
Docker CLI Referenz | https://docs.docker.com/engine/reference/commandline/docker/ |
Docker Compose CLI Referenz | https://docs.docker.com/compose/reference/ |
Next.js Deployment mit Docker Image | https://nextjs.org/docs/deployment#docker-image |
Next.js in Docker | https://benmarte.com/blog/nextjs-in-docker/ |
Next.js mit Docker Beispiel | https://github.com/vercel/next.js/tree/canary/examples/with-docker |
Erstelle ein Docker Image von einer Next.js app | https://blog.tericcabrel.com/create-docker-image-nextjs-application/ |