Docker build cache: .dockerignore, cache mount, layer reorder, restart script
- .dockerignore: exclude node_modules/.git/tmp/data/logs - Dockerfile: BuildKit cache mount for npm, --omit=dev at install, drop npm prune step - Reorder layers: shared/src/frontend copy before build, server copy + better-sqlite3 rebuild after. Server/shared changes no longer invalidate frontend build layer unless shared (FE dep) changes - Remove duplicate shared COPY in runtime stage (bundled in FE build) - docker/restart.sh: stop + rebuild + start in one script
This commit is contained in:
+10
-9
@@ -1,4 +1,5 @@
|
||||
# docker/Dockerfile — single container: caddy (front) + node (back).
|
||||
# syntax=docker/dockerfile:1
|
||||
# docker/Dockerfile --- single container: caddy (front) + node (back).
|
||||
# Build context = repo root.
|
||||
# ---- build stage: frontend + install backend deps ----
|
||||
FROM node:18-alpine AS build
|
||||
@@ -7,25 +8,26 @@ WORKDIR /app
|
||||
COPY package*.json ./
|
||||
COPY shared/package.json ./shared/
|
||||
COPY server/package.json ./server/
|
||||
RUN npm install --include-workspace-root
|
||||
RUN --mount=type=cache,target=/root/.npm \
|
||||
npm install --include-workspace-root --omit=dev --prefer-offline
|
||||
|
||||
# frontend code (changes often)
|
||||
COPY shared/ ./shared/
|
||||
COPY server/ ./server/
|
||||
COPY src/ ./src/
|
||||
COPY public/ ./public/
|
||||
COPY tailwind.config.js postcss.config.js ./
|
||||
|
||||
# better-sqlite3 native build (alpine musl)
|
||||
RUN cd server && npm rebuild better-sqlite3
|
||||
|
||||
# build frontend (server storage, same-origin /api + /ws via caddy)
|
||||
ARG REACT_APP_TRACKER_APP_ID=ttrpg-initiative-tracker-default
|
||||
ENV REACT_APP_STORAGE=server
|
||||
ENV REACT_APP_TRACKER_APP_ID=$REACT_APP_TRACKER_APP_ID
|
||||
RUN NODE_OPTIONS=--openssl-legacy-provider npm run build
|
||||
|
||||
# prune backend dev deps for runtime
|
||||
RUN npm prune --omit=dev
|
||||
# server after backend - it's fast. so changing server only doesnt invalidate slow frontend.
|
||||
COPY server/ ./server/
|
||||
# better-sqlite3 native build (alpine musl). Cached if server unchanged.
|
||||
RUN cd server && npm rebuild better-sqlite3
|
||||
|
||||
|
||||
# ---- runtime stage: caddy + node ----
|
||||
FROM node:18-alpine
|
||||
@@ -38,7 +40,6 @@ COPY --from=build /app/server/node_modules ./server/node_modules
|
||||
COPY --from=build /app/package*.json ./
|
||||
COPY --from=build /app/shared/package.json ./shared/
|
||||
COPY --from=build /app/server/package.json ./server/
|
||||
COPY shared/ ./shared/
|
||||
COPY server/ ./server/
|
||||
# built frontend served by caddy
|
||||
COPY --from=build /app/build /srv
|
||||
|
||||
Executable
+21
@@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env bash
|
||||
# scripts/docker-restart.sh — rebuild + restart docker container.
|
||||
# Usage: ./scripts/docker-restart.sh
|
||||
set -euo pipefail
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
echo "=== stopping existing container ==="
|
||||
docker compose -f docker/docker-compose.yml down 2>/dev/null || true
|
||||
|
||||
echo "=== rebuilding image ==="
|
||||
docker compose -f docker/docker-compose.yml build
|
||||
|
||||
echo "=== starting container ==="
|
||||
docker compose -f docker/docker-compose.yml up -d
|
||||
|
||||
echo "=== status ==="
|
||||
docker compose -f docker/docker-compose.yml ps
|
||||
|
||||
echo ""
|
||||
echo "app: http://localhost:${PORT:-8080}"
|
||||
echo "logs: docker compose -f docker/docker-compose.yml logs -f"
|
||||
Reference in New Issue
Block a user