Files
flashcards/Dockerfile

33 lines
1.3 KiB
Docker

# Flashcard — single-container production image.
# Runs the Express API and serves the built React frontend on PORT (default 3000).
#
# The backend is launched with tsx (TypeScript runtime) because the shared
# package is consumed as TypeScript source; this matches how the app runs in dev
# and avoids a separate compile step for the shared workspace.
FROM node:22-bookworm-slim
# better-sqlite3 is a native module. Provide a toolchain in case no prebuilt
# binary exists for the target platform (most amd64/arm64 hosts use a prebuild).
RUN apt-get update \
&& apt-get install -y --no-install-recommends python3 make g++ ca-certificates \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Install dependencies first for better layer caching.
# Do NOT set NODE_ENV=production here: the image needs devDependencies
# (vite to build the frontend, tsx to run the backend).
COPY package.json package-lock.json ./
COPY packages/shared/package.json packages/shared/package.json
COPY packages/backend/package.json packages/backend/package.json
COPY packages/frontend/package.json packages/frontend/package.json
RUN npm ci
# Copy the source and build the static frontend (served by the backend).
COPY . .
RUN npm -w @flashcard/frontend run build \
&& chmod +x /app/docker-entrypoint.sh
EXPOSE 3000
ENTRYPOINT ["/app/docker-entrypoint.sh"]