ARG NODE_VERSION="node:22-alpine" # ─── Builder ────────────────────────────────────────────────────────────────── FROM ${NODE_VERSION} AS builder WORKDIR /build # Zkopírování závislostí - OpenAPI generátor COPY types/package.json ./types/ COPY types/yarn.lock ./types/ COPY types/api.yml ./types/ COPY types/schemas ./types/schemas/ COPY types/paths ./types/paths/ COPY types/openapi-ts.config.ts ./types/ # Zkopírování závislostí - server COPY server/package.json ./server/ COPY server/yarn.lock ./server/ # Zkopírování závislostí - klient COPY client/package.json ./client/ COPY client/yarn.lock ./client/ # Instalace závislostí - OpenAPI generátor WORKDIR /build/types RUN yarn install --frozen-lockfile # Instalace závislostí - server WORKDIR /build/server RUN yarn install --frozen-lockfile # Instalace závislostí - klient WORKDIR /build/client RUN yarn install --frozen-lockfile WORKDIR /build # Zkopírování build závislostí - server COPY server/tsconfig.json ./server/ COPY server/src ./server/src/ # Zkopírování build závislostí - klient COPY client/tsconfig.json ./client/ COPY client/vite.config.ts ./client/ COPY client/vite-env.d.ts ./client/ COPY client/index.html ./client/ COPY client/src ./client/src COPY client/public ./client/public # Zkopírování společných typů COPY types/index.ts ./types/ # Vygenerování společných typů z OpenAPI WORKDIR /build/types RUN yarn openapi-ts # Sestavení serveru WORKDIR /build/server RUN yarn build # Sestavení klienta WORKDIR /build/client RUN yarn build # ─── Runner base ────────────────────────────────────────────────────────────── # Společný základ pro oba runner targety – nastaví prostředí a metadata běhu. FROM ${NODE_VERSION} AS runner-base RUN apk add --no-cache tzdata ENV TZ=Europe/Prague \ LC_ALL=cs_CZ.UTF-8 \ NODE_ENV=production WORKDIR /app # Export /data/db.json do složky /data VOLUME ["/data"] EXPOSE 3000 CMD [ "node", "./server/src/index.js" ] # ─── Runner (default) ───────────────────────────────────────────────────────── # Použití: docker build . (lokální sestavení – vše se buildí uvnitř image) FROM runner-base AS runner # Vykopírování sestaveného serveru COPY --from=builder /build/server/node_modules ./server/node_modules COPY --from=builder /build/server/dist ./ # Vykopírování sestaveného klienta COPY --from=builder /build/client/dist ./public # Zkopírování produkčních .env serveru COPY /server/.env.production ./server # Zkopírování changelogů (seznamu novinek) COPY /server/changelogs ./server/changelogs # Zkopírování konfigurace easter eggů RUN if [ -f ./server/.easter-eggs.json ]; then cp ./server/.easter-eggs.json ./server/; fi # ─── Runner (prebuilt) ──────────────────────────────────────────────────────── # Použití: docker build --target runner-prebuilt . # Očekává předem sestavené artefakty v build kontextu (server/dist, # client/dist, server/node_modules) – využívá Gitea Actions, kde se # server i klient buildí v separátních jobech a sem se jen kopírují. FROM runner-base AS runner-prebuilt # Vykopírování sestaveného serveru COPY ./server/node_modules ./server/node_modules COPY ./server/dist ./ # Vykopírování sestaveného klienta COPY ./client/dist ./public # Zkopírování changelogů (seznamu novinek) COPY ./server/changelogs ./server/changelogs # Zkopírování konfigurace easter eggů RUN if [ -f ./server/.easter-eggs.json ]; then cp ./server/.easter-eggs.json ./server/; fi