Docker-Compose-Setup ohne benannte Volumes
Der Container bringt die gebaute Anwendung mit; einziger Mount ist ./data:/app/data. Die Buchhaltung bleibt damit als gewöhnliche SQLite-Dateien im Projektverzeichnis und lässt sich ohne Docker sichern und einsehen. Der Server band bisher fest an 127.0.0.1 und wäre im Container von außen nicht erreichbar gewesen. Die Adresse ist jetzt über HOST einstellbar und bleibt außerhalb des Containers unverändert auf 127.0.0.1; im Container gilt 0.0.0.0, abgesichert über eine Portfreigabe, die nur auf 127.0.0.1 lauscht. Weitere Festlegungen: - Lauf unter der UID des aufrufenden Kontos, damit ./data nicht root gehört - schreibgeschütztes Containerdateisystem, beschreibbar nur /app/data und /tmp - .env wird nicht ins Image gebacken, sondern von docker-compose eingelesen - ERiC bleibt außen vor und ist bei Bedarf vom Host einzubinden Die Startmeldung nannte bisher nur, ob eine .env-Datei existiert. Im Container gibt es keine, obwohl die Konfiguration vollständig vorliegt – gemeldet wird jetzt der tatsächliche ERiC-Zustand. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
bf371c8118
commit
49ddaeccff
+56
@@ -0,0 +1,56 @@
|
||||
# syntax=docker/dockerfile:1
|
||||
|
||||
# Debian-Basis statt Alpine: better-sqlite3 ist ein natives Modul und findet
|
||||
# für glibc fertige Binaries. Unter musl müsste es im Image übersetzt werden.
|
||||
FROM node:22-bookworm-slim AS builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Erst die Manifeste kopieren – solange sie sich nicht ändern, bleibt die
|
||||
# Installationsschicht im Cache und ein Codeänderung baut in Sekunden.
|
||||
COPY package.json package-lock.json ./
|
||||
COPY server/package.json ./server/
|
||||
COPY web/package.json ./web/
|
||||
|
||||
RUN npm ci
|
||||
|
||||
COPY server ./server
|
||||
COPY web ./web
|
||||
|
||||
RUN npm run build
|
||||
|
||||
# Entwicklungsabhängigkeiten entfernen, das übersetzte better-sqlite3 bleibt
|
||||
# erhalten. Ein erneutes npm ci im Laufzeit-Image würde es neu bauen müssen.
|
||||
RUN npm prune --omit=dev
|
||||
|
||||
|
||||
FROM node:22-bookworm-slim AS runtime
|
||||
|
||||
ENV NODE_ENV=production \
|
||||
HOST=0.0.0.0 \
|
||||
PORT=3311
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Die Anwendung leitet ihre Pfade aus dem Ort von server/dist ab
|
||||
# (siehe server/src/pfade.ts). Deshalb muss die Ordnerstruktur erhalten bleiben:
|
||||
# /app/server/dist, /app/web/dist und /app/data.
|
||||
COPY --from=builder /app/node_modules ./node_modules
|
||||
COPY --from=builder /app/package.json ./package.json
|
||||
COPY --from=builder /app/server/package.json ./server/package.json
|
||||
COPY --from=builder /app/server/dist ./server/dist
|
||||
COPY --from=builder /app/web/dist ./web/dist
|
||||
COPY .env.beispiel ./.env.beispiel
|
||||
|
||||
# Der Node-Basisimage-Benutzer hat bereits UID 1000 und passt damit zu einem
|
||||
# typischen Desktop-Konto – die Dateien in ./data bleiben so dem Host gehören.
|
||||
RUN mkdir -p /app/data && chown -R node:node /app/data
|
||||
USER node
|
||||
|
||||
EXPOSE 3311
|
||||
|
||||
# Ohne curl im Image: die Prüfung läuft über Node selbst.
|
||||
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
||||
CMD node -e "fetch('http://127.0.0.1:'+(process.env.PORT||3311)+'/api/gesundheit').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"
|
||||
|
||||
CMD ["node", "server/dist/index.js"]
|
||||
Reference in New Issue
Block a user