You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Docker-compose构建NestJS生产镜像时构建期环境变量注入失败

问题分析与解决方案

问题原因

  1. Docker多阶段构建的每个阶段是完全独立的,development阶段中定义的ARG和ENV不会自动传递到production阶段。你在docker-compose中传递的DATABASE_URI仅作用于development构建阶段,最终运行的production容器中根本不存在这个环境变量。
  2. 你当前的production阶段没有接收DATABASE_URI构建参数,也未设置对应的环境变量,导致NestJS代码读取process.env.DATABASE_URI时返回undefined,进而触发数据库连接失败。

解决方案

方案一:构建阶段传递参数到生产环境(适合需构建时固化变量的场景)

修改Dockerfile的production阶段,新增ARG和ENV来接收并传递环境变量:

FROM node:alpine AS development

WORKDIR /src/app

ARG DATABASE_URI
ENV DATABASE_URI=$DATABASE_URI

COPY package*.json ./
RUN npm install
COPY . . 
RUN npm run build

######################################################
FROM node:alpine as production

ARG NODE_ENV=production
ENV NODE_ENV=$NODE_ENV
# 新增:接收构建参数并设置为容器环境变量
ARG DATABASE_URI
ENV DATABASE_URI=$DATABASE_URI

WORKDIR /src/app

COPY package*.json ./
RUN npm install --only=prod

# 建议仅复制必要文件,避免覆盖或带入开发配置
COPY --from=development /src/app/dist ./dist

CMD ["node", "dist/main"]

docker-compose.yml的配置保持不变,构建时DATABASE_URI会传递到production阶段并设置为容器环境变量。

方案二:运行时注入环境变量(更推荐,符合K8s部署习惯)

这种方式不需要在构建阶段传递参数,而是在容器运行时直接注入环境变量,和Kubernetes的deployment.yaml配置逻辑一致:

  1. 修改Dockerfile,移除构建阶段的DATABASE_URI相关配置:
FROM node:alpine AS development

WORKDIR /src/app

COPY package*.json ./
RUN npm install
COPY . . 
RUN npm run build

######################################################
FROM node:alpine as production

ARG NODE_ENV=production
ENV NODE_ENV=$NODE_ENV

WORKDIR /src/app

COPY package*.json ./
RUN npm install --only=prod

COPY --from=development /src/app/dist ./dist

CMD ["node", "dist/main"]
  1. 修改docker-compose.yml,在服务的environment字段配置环境变量:
server:
    build:
      context: ./server
    ports:
      - "5000:5000"
    environment:
      - DATABASE_URI=postgres://bingbong@bingbong.db.elephantsql.com/bingbong

容器启动时会自动加载该环境变量,NestJS代码可正常读取process.env.DATABASE_URI。

额外注意事项

  • 若使用@nestjs/config模块,确保配置正确,容器运行时的环境变量会覆盖本地.env文件的配置。
  • 避免在production阶段复制整个项目目录,防止带入开发环境的配置文件或冗余文件,仅复制package.json、dist等必要文件即可。

内容的提问来源于stack exchange,提问作者tudor14

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:10:35