From 5c4f3e52d284b2e3eab51cc4adbc4b9926275866 Mon Sep 17 00:00:00 2001 From: devops Date: Fri, 24 Jul 2026 06:27:31 +0000 Subject: [PATCH] Update workloads/ecommerce/Dockerfile --- workloads/ecommerce/Dockerfile | 111 +++++++++++++++++++++++---------- 1 file changed, 77 insertions(+), 34 deletions(-) diff --git a/workloads/ecommerce/Dockerfile b/workloads/ecommerce/Dockerfile index f2c78e6..aa1ca95 100644 --- a/workloads/ecommerce/Dockerfile +++ b/workloads/ecommerce/Dockerfile @@ -2,13 +2,18 @@ ARG NODE_IMAGE=node:24.18.0-bookworm-slim + # ============================================================ -# 1. Dependencias reproducibles +# 1. Dependencias # ============================================================ FROM ${NODE_IMAGE} AS deps WORKDIR /app +# Cambiar este valor invalida únicamente la capa de dependencias. +# Se incrementó para descartar la capa corrupta anterior. +ARG DEPS_CACHE_REV=20260720-2 + ENV NEXT_TELEMETRY_DISABLED=1 \ NPM_CONFIG_REGISTRY=https://registry.npmjs.org/ \ NPM_CONFIG_REPLACE_REGISTRY_HOST=always \ @@ -23,31 +28,37 @@ ENV NEXT_TELEMETRY_DISABLED=1 \ COPY package.json package-lock.json .npmrc ./ -# Normaliza cualquier URL interna que haya quedado grabada en el -# package-lock.json antes de ejecutar npm ci. + +# ------------------------------------------------------------ +# Normalizar URLs antiguas del registry +# ------------------------------------------------------------ RUN node <<'NODE' const fs = require("node:fs"); -const file = "package-lock.json"; +const filename = "package-lock.json"; const publicRegistry = "https://registry.npmjs.org/"; -let text = fs.readFileSync(file, "utf8"); +let content = fs.readFileSync(filename, "utf8"); let replacements = 0; -const internalRegistryPatterns = [ +const internalRegistries = [ /https?:\/\/packages\.applied-caas-gateway1\.internal\.api\.openai\.org\/artifactory\/api\/npm\/npm-public\//g, ]; -for (const pattern of internalRegistryPatterns) { - text = text.replace(pattern, () => { +for (const pattern of internalRegistries) { + content = content.replace(pattern, () => { replacements += 1; return publicRegistry; }); } -fs.writeFileSync(file, `${text.trimEnd()}\n`, "utf8"); +fs.writeFileSync( + filename, + `${content.trimEnd()}\n`, + "utf8" +); -const normalizedText = fs.readFileSync(file, "utf8"); +const normalized = fs.readFileSync(filename, "utf8"); const forbiddenHosts = [ "internal.api.openai.org", @@ -55,50 +66,70 @@ const forbiddenHosts = [ ]; const detectedHosts = forbiddenHosts.filter((host) => - normalizedText.includes(host) + normalized.includes(host) ); if (detectedHosts.length > 0) { console.error( - `ERROR: todavía existen registries no permitidos: ${detectedHosts.join(", ")}` + `ERROR: registries no permitidos: ${detectedHosts.join(", ")}` ); + process.exit(1); } -const lockfile = JSON.parse(normalizedText); +const lockfile = JSON.parse(normalized); console.log( - `Lockfile válido: ${lockfile.name} · lockfileVersion=${lockfile.lockfileVersion}` + `Lockfile válido: ${lockfile.name}` ); console.log( - `Referencias normalizadas hacia registry.npmjs.org: ${replacements}` + `lockfileVersion: ${lockfile.lockfileVersion}` +); + +console.log( + `Referencias normalizadas: ${replacements}` ); NODE + +# ------------------------------------------------------------ +# Validar conectividad con npm +# ------------------------------------------------------------ RUN node --version \ && npm --version \ && npm config get registry \ && npm config get replace-registry-host \ && npm ping -# Caché privado para no quedar esperando compilaciones simultáneas. -# El timeout fuerza la terminación si npm queda realmente bloqueado. + +# ------------------------------------------------------------ +# Instalar y verificar dependencias +# ------------------------------------------------------------ RUN --mount=type=cache,target=/root/.npm,sharing=private \ - timeout \ - --signal=TERM \ - --kill-after=30s \ - 900s \ - npm ci \ - --no-audit \ - --no-fund \ - --prefer-online \ - --loglevel=info \ - --timing + echo "DEPS_CACHE_REV=${DEPS_CACHE_REV}" \ + && timeout \ + --signal=TERM \ + --kill-after=30s \ + 900s \ + npm ci \ + --no-audit \ + --no-fund \ + --prefer-online \ + --loglevel=info \ + --timing \ + && test -d /app/node_modules \ + && test -f /app/node_modules/next/package.json \ + && test -f /app/node_modules/react/package.json \ + && node -e \ + "console.log('Next.js:', require('./node_modules/next/package.json').version)" \ + && node -e \ + "console.log('React:', require('./node_modules/react/package.json').version)" \ + && du -sh /app/node_modules # ============================================================ -# 2. Compilación de Next.js +# 2. Compilación Next.js # ============================================================ FROM ${NODE_IMAGE} AS builder @@ -108,14 +139,22 @@ ENV NODE_ENV=production \ NEXT_TELEMETRY_DISABLED=1 \ NODE_OPTIONS=--max-old-space-size=2048 -COPY --from=deps /app/node_modules ./node_modules +COPY --from=deps \ + /app/node_modules \ + ./node_modules + +COPY package.json package-lock.json ./ + COPY . . +RUN test -d /app/node_modules \ + && test -f /app/node_modules/next/package.json + RUN --mount=type=cache,target=/app/.next/cache,sharing=private \ npm run build -# next.config.ts debe contener output: "standalone". -RUN test -f /app/.next/standalone/server.js +RUN test -f /app/.next/standalone/server.js \ + && test -d /app/.next/static # ============================================================ @@ -132,18 +171,22 @@ ENV DEBIAN_FRONTEND=noninteractive \ PORT=80 RUN apt-get update \ - && apt-get install -y --no-install-recommends \ + && apt-get install -y \ + --no-install-recommends \ ca-certificates \ libcap2-bin \ && rm -rf /var/lib/apt/lists/* \ - && groupadd --gid 1001 nodejs \ + && groupadd \ + --gid 1001 \ + nodejs \ && useradd \ --uid 1001 \ --gid 1001 \ --create-home \ --shell /usr/sbin/nologin \ nextjs \ - && setcap 'cap_net_bind_service=+ep' \ + && setcap \ + 'cap_net_bind_service=+ep' \ /usr/local/bin/node COPY --from=builder \