Nuxt 3 环境变量在 Docker 中的正确注入与读取实践

大瑶同学_1999

大瑶同学_1999

2026-08-08

221人浏览

原创

Nuxt 3 环境变量在 Docker 中的正确注入与读取实践

本文详解 Nuxt 3 项目中 nuxt.config.ts 无法读取 .env 变量的根本原因,并提供适用于 SSR 模式与 Docker 部署的完整解决方案,涵盖构建时注入、运行时暴露、Docker 配置及 runtimeConfig 正确用法。

本文详解 nuxt 3 项目中 `nuxt.config.ts` 无法读取 `.env` 变量的根本原因,并提供适用于 ssr 模式与 docker 部署的完整解决方案,涵盖构建时注入、运行时暴露、docker 配置及 runtimeconfig 正确用法。

在 Nuxt 3 中,nuxt.config.ts 是一个构建时(build-time)执行的 Node.js 脚本,而非运行时(runtime)代码。这意味着它只能访问构建阶段可用的环境上下文——例如本地开发时的 .env 文件、CI/CD 的构建参数,或 Docker 构建阶段通过 ARG 注入的变量;而容器启动后通过 environment: 设置的运行时环境变量,对 nuxt.config.ts 完全不可见。这正是你遇到 process.env.NUXT_PUBLIC_STRAPI_BASE_URI 始终为空的根本原因:.env 文件虽挂载进容器,但 nuxt.config.ts 在构建镜像时早已执行完毕,此时挂载的 .env 对其无效。

✅ 正确做法:分清「构建时」与「运行时」,按需注入

1. 构建阶段注入(推荐用于 CI/CD 或多环境镜像构建)

使用 Docker ARG + --build-arg 在 docker build 时传入变量,确保 nuxt.config.ts 可读取:

# Dockerfile
FROM node:20-alpine AS builder
WORKDIR /src
COPY package*.json ./
RUN npm ci --silent
COPY . .
ARG NUXT_PUBLIC_STRAPI_BASE_URI
ARG NUXT_STRAPI_ADMIN_TOKEN
RUN npm run build

构建命令:

docker build \
  --build-arg NUXT_PUBLIC_STRAPI_BASE_URI="https://strapi.example.com" \
  --build-arg NUXT_STRAPI_ADMIN_TOKEN="your-secret-token" \
  -t nuxt-app .

并在 nuxt.config.ts 中直接使用:

export default defineNuxtConfig({
  runtimeConfig: {
    strapiAdminToken: process.env.NUXT_STRAPI_ADMIN_TOKEN || '',
    public: {
      strapiBaseUri: process.env.NUXT_PUBLIC_STRAPI_BASE_URI || '',
      stripe: {
        publishableKey: ''
      }
    }
  }
})

⚠️ 注意:NUXT_ 前缀变量会自动被 Nuxt 解析为 runtimeConfig,但前提是它们必须在构建时已存在(即 ARG 注入或本地 .env 加载),而非容器启动后才设置。

2. 运行时注入(适用于 Docker Compose 动态配置)

若需在容器启动时动态覆盖(如测试/预发环境),必须配合 Nuxt 的 Runtime Config API 使用:

✅ 正确写法(docker-compose.yml):

nuxt-app:
  container_name: nuxt-app
  image: ${CI_REGISTRY_IMAGE}/nuxt-app:latest
  restart: unless-stopped
  environment:
    # 必须以 NUXT_ 或 NUXT_PUBLIC_ 开头,且需在 runtimeConfig 中显式声明
    - NUXT_PUBLIC_STRAPI_BASE_URI=https://staging-strapi.example.com
    - NUXT_STRAPI_ADMIN_TOKEN=abc123
  ports:
    - "3000:3000"
  networks:
    - Strapi

同时确保 nuxt.config.ts 中显式引用环境变量(不能留空字符串):

Docker Compose Optimizer
Docker Compose Optimizer

优化 Docker Compose 配置,适用于开发和生产环境——审计服务、网络、卷、健康检查和资源管理。

下载
export default defineNuxtConfig({
  runtimeConfig: {
    // 私有变量(仅服务端可见)
    strapiAdminToken: process.env.NUXT_STRAPI_ADMIN_TOKEN,
    // 公共变量(客户端+服务端可见)
    public: {
      strapiBaseUri: process.env.NUXT_PUBLIC_STRAPI_BASE_URI,
      stripe: {
        publishableKey: process.env.NUXT_PUBLIC_STRIPE_PUBLISHABLE_KEY || ''
      }
    }
  }
})

✅ 关键点:Nuxt 3 的 runtimeConfig 支持运行时热替换(仅限 Nitro 服务端),但前提是:

  • 变量名严格匹配 NUXT_* / NUXT_PUBLIC_* 前缀;
  • nuxt.config.ts 中必须通过 process.env.XXX 显式赋值(不能写 '');
  • 启动命令需使用 node .output/server/index.mjs(非 npm run dev)。

3. 本地开发与多环境支持(.env + --dotenv)

为统一开发/构建流程,推荐在 package.json 中定义多环境脚本:

"scripts": {
  "dev": "nuxi dev --dotenv .env.development",
  "build:staging": "nuxi build --dotenv .env.staging",
  "build:prod": "nuxi build --dotenv .env.production"
}

对应 .env.staging 示例:

NUXT_PUBLIC_STRAPI_BASE_URI=https://staging-api.example.com
NUXT_STRAPI_ADMIN_TOKEN=staging_token_123

? 提示:.env 文件必须位于项目根目录,且格式严格为 KEY=VALUE(无空格、无引号)。Nuxt 自动加载 .env 仅在 nuxi dev/build/generate 阶段生效,不作用于 Docker 容器内运行时。

? 调试技巧:验证变量是否生效

在 nuxt.config.ts 顶部添加调试日志:

console.log('? Build-time env:', {
  STRAPI_BASE: process.env.NUXT_PUBLIC_STRAPI_BASE_URI,
  ADMIN_TOKEN: process.env.NUXT_STRAPI_ADMIN_TOKEN
})

构建后检查控制台输出;若为空,则说明构建时未注入成功。

✅ 最佳实践总结

场景 推荐方式 是否影响 nuxt.config.ts 客户端可访问
CI/CD 多环境镜像构建 ARG + --build-arg ✅ 是 ✅(需 NUXT_PUBLIC_ 前缀)
Docker Compose 动态部署 environment: + runtimeConfig 显式引用 ❌ 否(仅影响 Nitro 运行时) ✅
本地开发 --dotenv + .env.* ✅ 是 ✅
敏感密钥(如 token) NUXT_*(非 PUBLIC)+ runtimeConfig ✅ 是(构建时)/ ✅ 运行时(Nitro) ❌ 仅服务端

遵循以上原则,即可彻底解决 nuxt.config.ts 读不到环境变量的问题,实现安全、灵活、可复现的多环境部署。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

docker 环境变量

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
k8s和docker区别
k8s和docker区别

k8s和docker区别有抽象层次不同、管理范围不同、功能不同、应用程序生命周期管理不同、缩放能力不同、高可用性等等区别。本专题为大家提供k8s和docker区别相关的各种文章、以及下载和课程。

2023.07.24

785

4

docker进入容器的方法有哪些
docker进入容器的方法有哪些

docker进入容器的方法:1. Docker exec;2. Docker attach;3. Docker run --interactive --tty;4. Docker ps -a;5. 使用 Docker Compose。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

6379

6

docker容器无法访问外部网络怎么办
docker容器无法访问外部网络怎么办

docker 容器无法访问外部网络的原因和解决方法:配置 nat 端口映射以将容器端口映射到主机端口。根据主机兼容性选择正确的网络驱动(如 host 或 overlay)。允许容器端口通过主机的防火墙。配置容器的正确 dns 服务器。选择正确的容器网络模式。排除主机网络问题,如防火墙或连接问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

7497

6

docker镜像有什么用
docker镜像有什么用

docker 镜像是预构建的软件组件,用途广泛,包括:应用程序部署:简化部署,提高移植性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

2953

7

Docker容器化部署与DevOps实践
Docker容器化部署与DevOps实践

本专题面向后端与运维开发者,系统讲解 Docker 容器化技术在实际项目中的应用。内容涵盖 Docker 镜像构建、容器运行机制、Docker Compose 多服务编排,以及在 DevOps 流程中的持续集成与持续部署实践。通过真实场景演示,帮助开发者实现应用的快速部署、环境一致性与运维自动化。

2026.02.11

339

16

Docker 容器部署
Docker 容器部署

本专题整合了Docker容器部署相关内容,阅读专题下面的文章了解更多详细操作教程。

2026.03.31

491

14

Java容器化部署与Docker实践教程合集
Java容器化部署与Docker实践教程合集

聚焦 Java 应用的容器化与云原生部署,讲解 Dockerfile 编写规范与 Java 应用镜像构建、多阶段构建(Multi-stage Build)减小镜像体积、Jib / Buildpacks 免 Dockerfile 镜像构建方案、JVM 容器感知参数(-XX:MaxRAMPercentage)配置、Docker Compose 编排多服务(应用 + MySQL + Redis)、容器健康检查与资源限制、Kubernetes

2026.05.11

440

26

Go Docker与容器化部署教程合集
Go Docker与容器化部署教程合集

聚焦 Go 应用的容器化部署优势与实践,讲解 Go 静态编译特性(CGO_ENABLED=0)与 scratch / distroless 极小基础镜像构建、多阶段 Dockerfile 编写规范、交叉编译生成目标平台二进制、镜像安全扫描(Trivy)与漏洞修复、Docker Compose 本地编排开发环境、Kubernetes Deployment / Service / ConfigMap 部署 Go 服务、健康检查(Livene

2026.05.15

325

24

Hyperf 项目部署运维与性能调优手册
Hyperf 项目部署运维与性能调优手册

聚焦 Hyperf 在生产环境的落地,包含 Docker 高效打包、Swoole 配置优化、常见的内存溢出(OOM)问题排查方法以及热更新方案。

2026.05.19

525

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Docker Desktop故障排查手册
Docker Desktop故障排查手册

共0课时 | 0人学习

Docker镜像构建手册
Docker镜像构建手册

共0课时 | 0人学习