news 2026/5/7 16:06:48

深入解析 Spring Boot 容器化部署:三种方式传递环境变量给 Docker(含 docker run、.env 与 docker-compose 示例)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入解析 Spring Boot 容器化部署:三种方式传递环境变量给 Docker(含 docker run、.env 与 docker-compose 示例)

文章目录

  • 一、方式一:docker run -e 直接传环境变量
  • 二、方式二:使用 .env 文件 + docker run --env-file
  • 三、方式三:在 docker-compose.yml 中用 environment
  • 四、小结

在容器化部署 Spring Boot 应用时,我们常常希望:

不在源码中硬编码敏感配置(如数据库地址/密码)
在不同环境(开发/测试/生产)灵活覆盖配置
部署命令简单、可一键执行

Spring Boot 支持通过环境变量覆盖配置文件的属性,例如:

spring:datasource:url:jdbc:postgresql://${DB_HOST:192.168.121.140}:${DB_PORT:15432}/tcs?currentSchema=tcs,wvp273username:${DB_USER:postgres}password:${DB_PASSWORD:sky@20150907}

这种写法代表:

如果系统环境变量存在则优先使用,否则使用默认值。Spring Boot 在运行时会把这些占位符替换成实际的环境变量值。

下面我们详细介绍三种常见注入环境变量的方式。


一、方式一:docker run -e 直接传环境变量

最常见的方式是使用docker run -e(或--env)把变量直接传给容器:

dockerrun -d\-p18010:18010\-eSERVER_PORT=18010\-eDB_HOST=192.168.121.140\-eDB_PORT=15432\-eDB_USER=postgres\-eDB_PASSWORD=mySecretPwd\your-image:latest

-e VAR=value是 Docker 的标准写法,用来给容器设置环境变量
✔ Spring Boot 启动时会读取这些值覆盖application.yml中的默认配置

适用场景:

  • 运行单个容器或调试时临时覆盖变量
  • 没有环境文件,只想快速启动

⚠️ 不过这种方式将变量直接暴露在命令历史中,不太适合敏感信息长期管理。


二、方式二:使用 .env 文件 + docker run --env-file

为了更安全、更整洁地管理环境变量,可以将变量写进一个文件:

📄 创建.env文件

在项目根目录创建一个:

# .env 配置示例(不要提交到版本控制) SERVER_PORT=18010 DB_HOST=192.168.121.140 DB_PORT=15432 DB_USER=postgres DB_PASSWORD=mySecretPwd

然后通过--env-file引入:

dockerrun -d\--env-file .env\-p18010:18010\your-image:latest

📌--env-file会把文件里的每个变量注入到容器环境中,等同于写多个-e

优点:

  • 变量集中管理,命令更简洁
  • 更容易与 CI/CD(如 GitHub Actions / GitLab CI)集成
  • 避免把密码写在命令行里

📌 通常建议把.env加入.gitignore,避免敏感信息泄露。


三、方式三:在 docker-compose.yml 中用 environment

如果你用 Docker Compose,则可以在docker-compose.yml中直接定义环境变量:

version:"3.8"services:app:image:your-image:latestports:-"18010:18010"environment:-SERVER_PORT=18010-DB_HOST=192.168.121.140-DB_PORT=15432-DB_USER=postgres-DB_PASSWORD=mySecretPwd

运行:

dockercompose up -d

✔ 这种方式将变量写在 Compose 文件里结构化保存
✔ Spring Boot 启动时同样能读取到这些环境变量
✔ 与服务定义一起维护,更适合多个环境


四、小结

方式适合场景优点缺点
docker run -e VAR=value临时覆盖或单容器测试快速、直观变量写在命令行不利于管理
docker run --env-file .env多变量管理、敏感信息保护文件式管理、易维护需单独维护文件
docker-compose.yml environment多容器部署、结构化管理配置集中、可与服务联动变量长会拉长 Compose 文件

🧪 Spring Boot 配置如何读取环境变量总结

在 Spring Boot 的application.yml中,只要使用如下语法:

spring:datasource:username:${DB_USER:defaultUser}password:${DB_PASSWORD:defaultPwd}

Spring Boot 在运行时会:

  1. 优先从容器环境变量读取对应名称
  2. 如果未设置该变量,则回退使用指定的默认值

这种机制实现了配置与代码分离、不同环境灵活覆盖的目的。

🚀 最佳实践建议

✔ 部署生产环境时尽量不要直接在版本控制写敏感信息
✔ 对于更高安全性,考虑用Docker Secrets / Kubernetes Secrets替代普通环境变量
✔ Compose 配合.env+environment使用更规范、更易维护


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 23:52:57

高通SEE架构深度解析(3): 核心组件从功能模块到安全体系

高通SEE(Sensors Execution Environment/Secure Execution Environment)架构作为传感器管理与安全处理的核心框架,其组件设计围绕“高效调度”与“安全隔离”两大核心目标展开。结合高通官方文档、平台实现(如SDM845)及…

作者头像 李华
网站建设 2026/5/1 8:29:02

C++中的职责链模式实战

1、非修改序列算法这些算法不会改变它们所操作的容器中的元素。1.1 find 和 find_iffind(begin, end, value):查找第一个等于 value 的元素,返回迭代器(未找到返回 end)。find_if(begin, end, predicate):查找第一个满…

作者头像 李华
网站建设 2026/5/2 3:26:54

C++编译期反射实现

1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。 1.1 find 和 find_if find(begin, end, value):查找第一个等于 value 的元素,返回迭代器(未找到返回 end)。find_if(begin, end, predicate):查找第…

作者头像 李华
网站建设 2026/5/3 12:34:53

【读书笔记】《大流感》

《大流感》读书笔记 引言:史诗级的灾难 《大流感》描述的是1918年到1919年期间在全球流行的大流感。这场流感造成的死亡人数: 最早官方统计:2,100万人随着深入研究不断攀升:5,000万人这是人类历史上的重大灾难,但也…

作者头像 李华
网站建设 2026/5/5 19:30:21

设计模式在C++中的实现

1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。 1.1 find 和 find_if find(begin, end, value):查找第一个等于 value 的元素,返回迭代器(未找到返回 end)。find_if(begin, end, predicate):查找第…

作者头像 李华
网站建设 2026/5/5 15:10:28

基于最小均方算法的半球谐振子特征参数辨识方法

1. 论文中文标题 基于最小均方算法的半球谐振子特征参数辨识方法 2. 论文主要内容概括 本文针对半球谐振陀螺(HRG)核心元件——半球谐振子(HSR)缺乏有效性能量化评估方法的问题,提出一种基于最小均方(LMS)算法的特征参数辨识方法。该方法通过构建非理想谐振子的正交误…

作者头像 李华