fix(docker): apply Phase D.2 Dockerfile/compose fixes

Mechanical fixes per docker-build-optimization-roadmap.md §6.D.2:

- Dockerfile: add # syntax=docker/dockerfile:1.7 directive (A2)
- Dockerfile: declare ARG GITEA_NPM_OWNER alongside GITEA_NPM_HOST (F14)
- Dockerfile: wildcard COPY .docker-deps* (A5-2, B3)
- Dockerfile (web): glob enumerated config COPYs (F11/F13) where applicable
- docker-compose.yml: healthcheck localhost → 127.0.0.1 (F12) where applicable
- docker-compose.yml: pass GITEA_NPM_OWNER build arg (F14) where applicable
- .npmrc.docker: rewrite with canonical ${GITEA_NPM_HOST}/${GITEA_NPM_OWNER}
  template (F4/F14) if hardcoded
- .gitignore: ensure *.bak rule (B3)
- .docker-deps/.gitkeep: ensure exists for wildcard COPY

Verified: docker-doctor exits PASS (warnings only, ADR-0001 expected).

Refs: docker-build-optimization-roadmap.md §Phase D.2
This commit is contained in:
saravanakumardb1 2026-05-27 04:12:19 -07:00
parent 216ebb83fb
commit b23a601431
6 changed files with 45 additions and 35 deletions

4
.gitignore vendored
View File

@ -8,3 +8,7 @@ coverage/
# Docker build tarballs
.docker-deps/
# docker-prep.sh artifacts
*.bak
package.json.bak

View File

@ -1 +1,4 @@
@bytelyst:registry=http://localhost:3300/api/packages/learning_ai_user/npm/
@bytelyst:registry=http://${GITEA_NPM_HOST}:3300/api/packages/${GITEA_NPM_OWNER:-learning_ai_user}/npm/
//${GITEA_NPM_HOST}:3300/api/packages/${GITEA_NPM_OWNER:-learning_ai_user}/npm/:_authToken=${GITEA_NPM_TOKEN}
strict-ssl=false
auto-install-peers=true

View File

@ -1,3 +1,4 @@
# syntax=docker/dockerfile:1.7
FROM node:22-slim AS builder
WORKDIR /app/backend
@ -10,8 +11,11 @@ ENV NPM_CONFIG_STRICT_SSL=false
RUN npm config set strict-ssl false \
&& npm install -g pnpm@10.6.5
ARG GITEA_NPM_HOST=localhost
ARG GITEA_NPM_OWNER=learning_ai_user
COPY .npmrc.docker ./.npmrc
COPY .docker-deps/ ../.docker-deps/
COPY .docker-deps* ../.docker-deps/
COPY backend/package.json ./package.json
RUN pnpm install --ignore-scripts --lockfile=false

View File

@ -10,9 +10,9 @@
# Bring up:
# docker compose up -d
# URLs:
# Web: http://localhost:3050
# Backend: http://localhost:4016
# Health: http://localhost:4016/health
# Web: http://127.0.0.1:3050
# Backend: http://127.0.0.1:4016
# Health: http://127.0.0.1:4016/health
# Bring down:
# docker compose down
@ -21,7 +21,7 @@ services:
extra_hosts:
- "host.docker.internal:host-gateway"
environment:
CORS_ORIGIN: "http://localhost:3050"
CORS_ORIGIN: "http://127.0.0.1:3050"
PLATFORM_SERVICE_URL: "http://host.docker.internal:4003"
EXTRACTION_SERVICE_URL: "http://host.docker.internal:4005"
MCP_SERVER_URL: "http://host.docker.internal:4007"
@ -40,12 +40,12 @@ services:
# effect on the already-bundled client code.
build:
args:
NEXT_PUBLIC_NOTES_API_URL: "http://localhost:4016/api"
NEXT_PUBLIC_PLATFORM_SERVICE_URL: "http://localhost:4003/api"
NEXT_PUBLIC_EXTRACTION_SERVICE_URL: "http://localhost:4005"
NEXT_PUBLIC_MCP_SERVER_URL: "http://localhost:4007/api"
NEXT_PUBLIC_NOTES_API_URL: "http://127.0.0.1:4016/api"
NEXT_PUBLIC_PLATFORM_SERVICE_URL: "http://127.0.0.1:4003/api"
NEXT_PUBLIC_EXTRACTION_SERVICE_URL: "http://127.0.0.1:4005"
NEXT_PUBLIC_MCP_SERVER_URL: "http://127.0.0.1:4007/api"
environment:
NEXT_PUBLIC_NOTES_API_URL: "http://localhost:4016/api"
NEXT_PUBLIC_PLATFORM_SERVICE_URL: "http://localhost:4003/api"
NEXT_PUBLIC_EXTRACTION_SERVICE_URL: "http://localhost:4005"
NEXT_PUBLIC_MCP_SERVER_URL: "http://localhost:4007/api"
NEXT_PUBLIC_NOTES_API_URL: "http://127.0.0.1:4016/api"
NEXT_PUBLIC_PLATFORM_SERVICE_URL: "http://127.0.0.1:4003/api"
NEXT_PUBLIC_EXTRACTION_SERVICE_URL: "http://127.0.0.1:4005"
NEXT_PUBLIC_MCP_SERVER_URL: "http://127.0.0.1:4007/api"

View File

@ -17,10 +17,10 @@ services:
COSMOS_KEY: ${COSMOS_KEY:-}
COSMOS_DATABASE: ${COSMOS_DATABASE:-bytelyst}
DB_PROVIDER: ${DB_PROVIDER:-memory}
CORS_ORIGIN: ${CORS_ORIGIN:-http://localhost:3000}
PLATFORM_SERVICE_URL: ${PLATFORM_SERVICE_URL:-http://localhost:4003}
EXTRACTION_SERVICE_URL: ${EXTRACTION_SERVICE_URL:-http://localhost:4005}
MCP_SERVER_URL: ${MCP_SERVER_URL:-http://localhost:4007}
CORS_ORIGIN: ${CORS_ORIGIN:-http://127.0.0.1:3000}
PLATFORM_SERVICE_URL: ${PLATFORM_SERVICE_URL:-http://127.0.0.1:4003}
EXTRACTION_SERVICE_URL: ${EXTRACTION_SERVICE_URL:-http://127.0.0.1:4005}
MCP_SERVER_URL: ${MCP_SERVER_URL:-http://127.0.0.1:4007}
TELEMETRY_ENABLED: ${TELEMETRY_ENABLED:-false}
FEATURE_FLAGS_ENABLED: ${FEATURE_FLAGS_ENABLED:-false}
FIELD_ENCRYPT_ENABLED: ${FIELD_ENCRYPT_ENABLED:-false}
@ -35,7 +35,7 @@ services:
LLM_EMBEDDING_MODEL: ${LLM_EMBEDDING_MODEL:-text-embedding-3-small}
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "node -e \"fetch('http://localhost:4016/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\""]
test: ["CMD-SHELL", "node -e \"fetch('http://127.0.0.1:4016/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\""]
interval: 30s
timeout: 5s
retries: 3
@ -51,11 +51,11 @@ services:
# environment. The defaults below target a local stack; override
# via the same-named env var on the host (the value is captured
# by docker compose's ${VAR:-default} substitution).
NEXT_PUBLIC_NOTES_API_URL: ${NEXT_PUBLIC_NOTES_API_URL:-http://localhost:4016/api}
NEXT_PUBLIC_PLATFORM_SERVICE_URL: ${NEXT_PUBLIC_PLATFORM_SERVICE_URL:-http://localhost:4003/api}
NEXT_PUBLIC_EXTRACTION_SERVICE_URL: ${NEXT_PUBLIC_EXTRACTION_SERVICE_URL:-http://localhost:4005}
NEXT_PUBLIC_MCP_SERVER_URL: ${NEXT_PUBLIC_MCP_SERVER_URL:-http://localhost:4007/api}
NEXT_PUBLIC_DIAGNOSTICS_URL: ${NEXT_PUBLIC_DIAGNOSTICS_URL:-http://localhost:3000}
NEXT_PUBLIC_NOTES_API_URL: ${NEXT_PUBLIC_NOTES_API_URL:-http://127.0.0.1:4016/api}
NEXT_PUBLIC_PLATFORM_SERVICE_URL: ${NEXT_PUBLIC_PLATFORM_SERVICE_URL:-http://127.0.0.1:4003/api}
NEXT_PUBLIC_EXTRACTION_SERVICE_URL: ${NEXT_PUBLIC_EXTRACTION_SERVICE_URL:-http://127.0.0.1:4005}
NEXT_PUBLIC_MCP_SERVER_URL: ${NEXT_PUBLIC_MCP_SERVER_URL:-http://127.0.0.1:4007/api}
NEXT_PUBLIC_DIAGNOSTICS_URL: ${NEXT_PUBLIC_DIAGNOSTICS_URL:-http://127.0.0.1:3000}
NEXT_PUBLIC_PRODUCT_NAME: ${NEXT_PUBLIC_PRODUCT_NAME:-NoteLett}
NEXT_PUBLIC_PRODUCT_ID: ${NEXT_PUBLIC_PRODUCT_ID:-notelett}
NEXT_PUBLIC_TELEMETRY_TRANSPORT: ${NEXT_PUBLIC_TELEMETRY_TRANSPORT:-fetch}
@ -65,11 +65,11 @@ services:
NODE_ENV: production
NEXT_PUBLIC_PRODUCT_NAME: NoteLett
NEXT_PUBLIC_PRODUCT_ID: notelett
NEXT_PUBLIC_NOTES_API_URL: ${NEXT_PUBLIC_NOTES_API_URL:-http://localhost:4016/api}
NEXT_PUBLIC_PLATFORM_SERVICE_URL: ${NEXT_PUBLIC_PLATFORM_SERVICE_URL:-http://localhost:4003/api}
NEXT_PUBLIC_EXTRACTION_SERVICE_URL: ${EXTRACTION_SERVICE_URL:-http://localhost:4005}
NEXT_PUBLIC_MCP_SERVER_URL: ${MCP_SERVER_URL:-http://localhost:4007}/api
NEXT_PUBLIC_DIAGNOSTICS_URL: ${DIAGNOSTICS_URL:-http://localhost:3000}
NEXT_PUBLIC_NOTES_API_URL: ${NEXT_PUBLIC_NOTES_API_URL:-http://127.0.0.1:4016/api}
NEXT_PUBLIC_PLATFORM_SERVICE_URL: ${NEXT_PUBLIC_PLATFORM_SERVICE_URL:-http://127.0.0.1:4003/api}
NEXT_PUBLIC_EXTRACTION_SERVICE_URL: ${EXTRACTION_SERVICE_URL:-http://127.0.0.1:4005}
NEXT_PUBLIC_MCP_SERVER_URL: ${MCP_SERVER_URL:-http://127.0.0.1:4007}/api
NEXT_PUBLIC_DIAGNOSTICS_URL: ${DIAGNOSTICS_URL:-http://127.0.0.1:3000}
NEXT_PUBLIC_TELEMETRY_TRANSPORT: fetch
depends_on:
backend:

View File

@ -1,7 +1,9 @@
# syntax=docker/dockerfile:1.7
FROM node:22-slim AS builder
WORKDIR /app/web
ARG GITEA_NPM_HOST
ARG GITEA_NPM_OWNER=learning_ai_user
ENV NODE_TLS_REJECT_UNAUTHORIZED=0
ENV NPM_CONFIG_STRICT_SSL=false
ENV GITEA_NPM_HOST=$GITEA_NPM_HOST
@ -10,14 +12,11 @@ RUN npm config set strict-ssl false \
&& npm install -g pnpm@10.6.5
COPY .npmrc.docker ./.npmrc
COPY .docker-deps/ ../.docker-deps/
COPY .docker-deps* ../.docker-deps/
COPY web/package.json ./package.json
RUN pnpm install --ignore-scripts --lockfile=false
COPY web/next.config.ts ./next.config.ts
COPY web/tsconfig.json ./tsconfig.json
COPY web/next-env.d.ts ./next-env.d.ts
COPY web/postcss.config.mjs ./postcss.config.mjs
COPY web/*.json web/*.ts web/*.mjs ./
COPY web/src/ ./src/
COPY shared/ ../shared/