Next.js 应用程序在构建时捆绑环境变量。这就是为什么我需要将环境变量作为参数传递并在构建阶段使用它们的原因。现在,作为 CD/CI 管道的一部分,我想通过在 compose.yaml 中声明的环境变量动态传递参数。但是,在构建时不会读取来自 Compose 文件的环境变量。事实上,终端会打印以下消息:
time="2024-12-12T23:35:10-05:00" level=warning msg="未设置“NEXT_PUBLIC_GRAPHQL_SERVER”变量。默认为空字符串。"
Compose.yaml
services:
frontend:
build:
context: ./frontend
args:
- NEXT_PUBLIC_GRAPHQL_SERVER=${NEXT_PUBLIC_GRAPHQL_SERVER}
env_file:
- ./frontend/.env
environment:
NODE_ENV: production
NEXT_PUBLIC_GRAPHQL_SERVER: http://localhost:3000/
ports:
- 8080:8080
docker文件:
FROM base AS builder
WORKDIR /usr/src/app
COPY --from=deps /usr/src/app/node_modules ./node_modules
COPY . .
ARG NEXT_PUBLIC_GRAPHQL_SERVER
ENV NEXT_PUBLIC_GRAPHQL_SERVER=${NEXT_PUBLIC_GRAPHQL_SERVER}
RUN npm run build
当我在 args 中明确设置环境变量时,一切都正常,但这不是所需的工作流程。
services:
frontend:
build:
context: ./frontend
args:
- NEXT_PUBLIC_GRAPHQL_SERVER=http://localhost:3000/
您需要区分为构建、容器运行时和组合本身准备的环境。
Docker compose 本身在第一次解析 compose.yml 文件时不会使用
env_file:
扩展 compose.yml 中的任何 ${VAR} 指令 - 该指令用于将变量注入容器。因此,docker 自己的环境就是变量的来源:
.env
与 compose.yml 位于同一文件夹中的文件,在执行 docker compose 之前导出的任何环境变量都是 compose.yml 中变量扩展的来源。