FROM repo.nstart.cloud/dockerhub/library/node:22-alpine AS build # Build identity для VersionBadge / UpdateBanner. Внутри Docker build context # нет .git/ (BUILD_CONTEXT=ordinis-admin-ui/), vite execSync падает → # fallback "unknown" / package.json. CI передаёт реальные значения через # --build-arg (см. .gitlab-ci.yml publish_script .docker_base). # # GIT_TAG — "none" sentinel когда CI_COMMIT_TAG не set (branch pipeline). # Фильтруем "none" → пустая строка чтобы vite.config.ts видел falsy и # fallback'ил к package.json. ARG GIT_COMMIT=unknown ARG GIT_TAG=none ENV CI_COMMIT_SHORT_SHA=$GIT_COMMIT ENV CI_COMMIT_TAG=$GIT_TAG WORKDIR /app # .npmrc нужен ДО pnpm install, иначе @nstart/* резолвятся в public npm и 404. # pnpm-lock.yaml — для воспроизводимости (frozen lockfile в CI). COPY package.json pnpm-lock.yaml .npmrc ./ # Pin pnpm@9.15.4 — exact version для reproducibility + lockfile compat # (pnpm-lock.yaml lockfileVersion: '9.0'). # - corepack может hang в CI на integrity-check / non-TTY prompts. npm # install --silent надёжнее. # - v10+ блокирует postinstall scripts ("Run pnpm approve-builds..."), в CI # нет интерактивного prompt'а → exit 1. v9 keeps старое поведение. RUN npm install -g --silent pnpm@9.15.4 RUN --mount=type=cache,target=/root/.local/share/pnpm/store pnpm install --frozen-lockfile COPY . . RUN pnpm build FROM repo.nstart.cloud/dockerhub/library/nginx:1.27-alpine COPY --from=build /app/dist /usr/share/nginx/html # Шаблон обрабатывается официальным entrypoint nginx-image: # /docker-entrypoint.d/20-envsubst-on-templates.sh пробегает по # /etc/nginx/templates/*.template и envsubst'ит ENV vars в /etc/nginx/conf.d/. COPY nginx.conf /etc/nginx/templates/default.conf.template ENV NGINX_ENVSUBST_TEMPLATE_DIR=/etc/nginx/templates \ NGINX_ENVSUBST_TEMPLATE_SUFFIX=.template \ NGINX_ENVSUBST_OUTPUT_DIR=/etc/nginx/conf.d EXPOSE 80