Al probar y usar mi aplicación NextJS con .env.local, todo funciona muy bien. Sin embargo, cuando hago una compilación de producción para implementar, no puede encontrar los valores de .env.production (aunque por ahora es una copia exacta de .env.local). Cuando agregué un punto final que hace un console.log (process.env), ninguno de los valores de .env.production está presente.
Aquí está mi Dockerfile
# Install dependencies only when needed FROM node:alpine AS deps # Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. RUN apk add --no-cache libc6-compat WORKDIR /app COPY package.json yarn.lock ./ RUN yarn install --frozen-lockfile # Rebuild the source code only when needed FROM node:alpine AS builder WORKDIR /app COPY . . COPY --from=deps /app/node_modules ./node_modules RUN yarn build && yarn install --production --ignore-scripts --prefer-offline # Production image, copy all the files and run next FROM node:alpine AS runner WORKDIR /app ENV NODE_ENV production RUN addgroup -g 1001 -S nodejs RUN adduser -S nextjs -u 1001 # You only need to copy next.config.js if you are NOT using the default configuration # COPY --from=builder /app/next.config.js ./ COPY --from=builder /app/public ./public COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/package.json ./package.json USER nextjs EXPOSE 3000 # Next.js collects completely anonymous telemetry data about general usage. # Learn more here: https://nextjs.org/telemetry # Uncomment the following line in case you want to disable telemetry. # ENV NEXT_TELEMETRY_DISABLED 1 CMD ["yarn", "start"]y construyo la imagen con este comando:
docker build -t my-next-project .Al hacer una compilación manual:
next builddice en la consola:
info - Loaded env from /Users/name/source/my-next-project/.env.local info - Loaded env from /Users/name/source/my-next-project/.env.productionAsí que encuentra los dos archivos .env... no estoy seguro de qué es lo que no funciona aquí.
Editar:
Aquí está el registro de la ejecución de mi comando docker build -t app-container .
[+] Building 140.1s (14/21) => => transferring dockerfile: 37B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/node:alpine 1.4s => [auth] library/node:pull token for registry-1.docker.io 0.0s [+] Building 140.2s (14/21) => => transferring context: 290.52MB 17.2s => [deps 1/5] FROM docker.io/library/node:alpine@sha256:f372a9ffcec27159dc9623bad29997a1b61eafbb145dbf4f7a64568be2f59b99 0.0s => CACHED [deps 2/5] RUN apk add --no-cache libc6-compat 0.0s => CACHED [deps 3/5] WORKDIR /app 0.0s => [deps 4/5] COPY package.json yarn.lock ./ 0.4s [+] Building 140.4s (14/21) => [deps 1/5] FROM docker.io/library/node:alpine@sha256:f372a9ffcec27159dc9623bad29997a1b61eafbb145dbf4f7a64568be2f59b99 0.0s [+] Building 140.5s (14/21) => CACHED [deps 3/5] WORKDIR /app 0.0s [+] Building 152.6s (22/22) FINISHED => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 37B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/node:alpine 1.4s => [auth] library/node:pull token for registry-1.docker.io 0.0s => [internal] load build context 17.6s => => transferring context: 290.52MB 17.2s => [deps 1/5] FROM docker.io/library/node:alpine@sha256:f372a9ffcec27159dc9623bad29997a1b61eafbb145dbf4f7a64568be2f59b99 0.0s => CACHED [deps 2/5] RUN apk add --no-cache libc6-compat 0.0s => CACHED [deps 3/5] WORKDIR /app 0.0s => [deps 4/5] COPY package.json yarn.lock ./ 0.4s => CACHED [builder 2/6] WORKDIR /app 0.0s => [builder 3/6] COPY . . 10.6s => [deps 5/5] RUN yarn install --frozen-lockfile 33.0s => [builder 4/6] ADD ./.env.production ./.env.production 0.1s => [builder 5/6] COPY --from=deps /app/node_modules ./node_modules 3.0s => [builder 6/6] RUN NODE_ENV=production yarn build && yarn install --production --ignore-scripts --prefer-offline 89.7s => CACHED [runner 3/8] RUN addgroup -g 1001 -S nodejs 0.0s => CACHED [runner 4/8] RUN adduser -S nextjs -u 1001 0.0s => [runner 5/8] COPY --from=builder /app/public ./public 0.1s => [runner 6/8] COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next 0.4s => [runner 7/8] COPY --from=builder /app/node_modules ./node_modules 1.8s => [runner 8/8] COPY --from=builder /app/package.json ./package.json 0.0s => exporting to image 1.9s => => exporting layers 1.9s => => writing image sha256:0e529630769589eefbdb0871e7024ea7f296db978c45102e7804e489d6d2f712 0.0s => => naming to docker.io/library/app-containerDado que React genera/compila archivos para producción y proyectos de reacción ejecutados en el lado del cliente, las variables ambientales que establezca solo se aplican al entorno del servidor, no a la aplicación que se ejecuta en el navegador. Debe proporcionar sus variables en el momento de la compilación para que el constructor las reemplace/guarde en los archivos generados.
Entonces, use un Dockerfile paramétrico para sus compilaciones como:
archivo acoplable:
... FROM abc-image ARG VARIABLE_NAME="Default value(may be for your local development)" # after FROM ... ... ENV VARIABLE_NAME_IN_REACT=$VARIABLE_NAME # at step just before the build # (I have not tried but single name might be enough as both arg and # variable name) ...En su tubería donde su línea de "construcción de ventana acoplable":
... docker build --build-arg VARIABLE_NAME="Value of the variable" ...Según mi experiencia, NextJs parece leer los archivos .env cuando se inicia. Por lo tanto, .env.production debe estar presente en el yarn start . Pero en su Dockerfile actual no se copió en su etapa de ejecución. Así que agregue la siguiente línea en su etapa de corredor:
COPY --from=builder /app/.env.production ./Si NO está utilizando la configuración predeterminada, debe descomentar:
COPY --from=builder /app/next.config.js ./ en esta parte, debe copiar todos sus archivos de producción en un contenedor como sus archivos .env del builder como:
COPY --from=builder /app/.env.production ./