From 80bca3e5c549ecb2d10ce8bf73c7bc9b3808250b Mon Sep 17 00:00:00 2001 From: devops Date: Fri, 24 Jul 2026 06:40:53 +0000 Subject: [PATCH] Update workloads/ecommerce/Dockerfile --- workloads/ecommerce/Dockerfile | 212 ++++++++++++++++++++++++++------- 1 file changed, 166 insertions(+), 46 deletions(-) diff --git a/workloads/ecommerce/Dockerfile b/workloads/ecommerce/Dockerfile index 29eab6e..7463503 100644 --- a/workloads/ecommerce/Dockerfile +++ b/workloads/ecommerce/Dockerfile @@ -10,28 +10,31 @@ 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 +ARG DEPS_CACHE_REV=20260724-3 ENV NODE_ENV=development \ NEXT_TELEMETRY_DISABLED=1 \ NPM_CONFIG_REGISTRY=https://registry.npmjs.org/ \ NPM_CONFIG_REPLACE_REGISTRY_HOST=always \ + NPM_CONFIG_PACKAGE_LOCK=true \ + NPM_CONFIG_PACKAGE_LOCK_ONLY=false \ + NPM_CONFIG_DRY_RUN=false \ + NPM_CONFIG_GLOBAL=false \ NPM_CONFIG_AUDIT=false \ NPM_CONFIG_FUND=false \ NPM_CONFIG_FETCH_RETRIES=2 \ NPM_CONFIG_FETCH_RETRY_MINTIMEOUT=5000 \ NPM_CONFIG_FETCH_RETRY_MAXTIMEOUT=30000 \ NPM_CONFIG_FETCH_TIMEOUT=120000 \ - NPM_CONFIG_MAXSOCKETS=8 + NPM_CONFIG_MAXSOCKETS=8 \ + NPM_CONFIG_LOGLEVEL=info COPY package.json package-lock.json .npmrc ./ -# ------------------------------------------------------------ -# Normalizar URLs antiguas del registry -# ------------------------------------------------------------ +# ============================================================ +# Normalizar registries grabados en package-lock.json +# ============================================================ RUN node <<'NODE' const fs = require("node:fs"); @@ -41,11 +44,11 @@ const publicRegistry = "https://registry.npmjs.org/"; let content = fs.readFileSync(filename, "utf8"); let replacements = 0; -const internalRegistries = [ +const internalRegistryPatterns = [ /https?:\/\/packages\.applied-caas-gateway1\.internal\.api\.openai\.org\/artifactory\/api\/npm\/npm-public\//g, ]; -for (const pattern of internalRegistries) { +for (const pattern of internalRegistryPatterns) { content = content.replace(pattern, () => { replacements += 1; return publicRegistry; @@ -58,15 +61,18 @@ fs.writeFileSync( "utf8" ); -const normalized = fs.readFileSync(filename, "utf8"); +const normalizedContent = fs.readFileSync( + filename, + "utf8" +); const forbiddenHosts = [ "internal.api.openai.org", "packages.applied-caas-gateway1", ]; -const detectedHosts = forbiddenHosts.filter((host) => - normalized.includes(host) +const detectedHosts = forbiddenHosts.filter( + (host) => normalizedContent.includes(host) ); if (detectedHosts.length > 0) { @@ -77,55 +83,164 @@ if (detectedHosts.length > 0) { process.exit(1); } -const lockfile = JSON.parse(normalized); +const packageJson = JSON.parse( + fs.readFileSync("package.json", "utf8") +); + +const lockfile = JSON.parse(normalizedContent); + +const productionDependencies = Object.keys( + packageJson.dependencies || {} +); + +const developmentDependencies = Object.keys( + packageJson.devDependencies || {} +); + +const declaredDependencies = + productionDependencies.length + + developmentDependencies.length; + +const lockedPackages = Object.keys( + lockfile.packages || {} +).length; console.log( - `Lockfile válido: ${lockfile.name}` + `Proyecto: ${packageJson.name}` ); console.log( - `lockfileVersion: ${lockfile.lockfileVersion}` + `Dependencias production: ${productionDependencies.length}` +); + +console.log( + `Dependencias development: ${developmentDependencies.length}` +); + +console.log( + `Dependencias declaradas: ${declaredDependencies}` +); + +console.log( + `Entradas package-lock: ${lockedPackages}` ); console.log( `Referencias normalizadas: ${replacements}` ); + +if (declaredDependencies === 0) { + console.error( + "ERROR: package.json no contiene dependencias." + ); + + process.exit(1); +} + +if (lockedPackages <= 1) { + console.error( + "ERROR: package-lock.json no contiene el árbol de dependencias." + ); + + process.exit(1); +} NODE -# ------------------------------------------------------------ -# Validar conectividad con npm -# ------------------------------------------------------------ -RUN node --version \ +# ============================================================ +# Validar configuración efectiva de npm +# ============================================================ +RUN echo "DEPS_CACHE_REV=${DEPS_CACHE_REV}" \ + && node --version \ && npm --version \ - && npm config get registry \ - && npm config get replace-registry-host \ + && echo "registry=$(npm config get registry)" \ + && echo "package-lock=$(npm config get package-lock)" \ + && echo "package-lock-only=$(npm config get package-lock-only)" \ + && echo "dry-run=$(npm config get dry-run)" \ + && echo "global=$(npm config get global)" \ + && echo "omit=$(npm config get omit)" \ && npm ping -# ------------------------------------------------------------ -# Instalar y verificar dependencias -# ------------------------------------------------------------ -RUN --mount=type=cache,target=/root/.npm,sharing=private \ - 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 +# ============================================================ +# Instalar dependencias +# ============================================================ +RUN --mount=type=cache,target=/root/.npm,sharing=private <<'SHELL' +set -eu + +echo "==================================================" +echo "Instalando dependencias de ARI Shopping" +echo "==================================================" + +rm -rf /app/node_modules + +timeout \ + --signal=TERM \ + --kill-after=30s \ + 900s \ +npm ci \ + --include=prod \ + --include=dev \ + --include=optional \ + --package-lock=true \ + --package-lock-only=false \ + --dry-run=false \ + --global=false \ + --no-audit \ + --no-fund \ + --prefer-online \ + --foreground-scripts \ + --loglevel=info \ + --timing + +echo +echo "==================================================" +echo "Validando node_modules" +echo "==================================================" + +test -d /app/node_modules || { + echo "ERROR: npm ci no creó /app/node_modules." + exit 1 +} + +test -f /app/node_modules/next/package.json || { + echo "ERROR: Next.js no fue instalado." + exit 1 +} + +test -f /app/node_modules/react/package.json || { + echo "ERROR: React no fue instalado." + exit 1 +} + +test -f /app/node_modules/typescript/package.json || { + echo "ERROR: TypeScript no fue instalado." + exit 1 +} + +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 + ) +" + +node -e " + console.log( + 'TypeScript:', + require('./node_modules/typescript/package.json').version + ) +" + +du -sh /app/node_modules +SHELL # ============================================================ @@ -148,7 +263,8 @@ COPY package.json package-lock.json ./ COPY . . RUN test -d /app/node_modules \ - && test -f /app/node_modules/next/package.json + && test -f /app/node_modules/next/package.json \ + && test -f /app/node_modules/react/package.json RUN --mount=type=cache,target=/app/.next/cache,sharing=private \ npm run build @@ -213,6 +329,10 @@ HEALTHCHECK \ --timeout=8s \ --start-period=30s \ --retries=3 \ - CMD ["node", "-e", "fetch('http://127.0.0.1/api/health').then(r => process.exit(r.ok ? 0 : 1)).catch(() => process.exit(1))"] + CMD [ + "node", + "-e", + "fetch('http://127.0.0.1/api/health').then(r => process.exit(r.ok ? 0 : 1)).catch(() => process.exit(1))" + ] CMD ["node", "server.js"] \ No newline at end of file