news 2026/4/18 13:47:37

深入解析 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/18 7:51:39

Python多线程与多进程:如何选择?(GIL全局解释器锁详解)

SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式。本文将介绍如何使用SQLAlchemy ORM进行数据库操作。目录安装SQLAlchemy核心概念连接数据库定义数据模型创建数据库表基本CRUD操作查询数据关系操…

作者头像 李华
网站建设 2026/4/17 17:37:29

Razor 简介

Razor 简介 概述 Razor 是一种由微软开发的开源服务器端标记语言,它主要用于在 ASP.NET MVC 和 ASP.NET Web Pages 应用程序中创建动态网页。Razor 的设计理念是让开发者能够以简洁的方式编写视图代码,同时保持与 HTML 的紧密集成。本文将详细介绍 Razor 的基本概念、工作原…

作者头像 李华
网站建设 2026/4/18 10:49:46

7-16 WPS JS宏 RandBetween、Address实例8--[唯一性]类的应用

7-16 WPS JS宏 RandBetween、Address实例8--[唯一性]类的应用 函数 RandBetween: 为excel函数,需要WorksheetFunction调用。 格式:WorksheetFunction.RandBetween(起点,终点) Address: 为显示地址 格式:区域范围等…

作者头像 李华
网站建设 2026/4/18 11:01:59

Moltbot 超详细安装使用教程(初学者版)

🦞 从零开始,手把手教你安装配置 Moltbot 个人 AI 助手 适合人群:完全没有编程经验的小白用户 目录 一、什么是 Moltbot?为什么要用它? 1.1 简单理解 1.2 它和 ChatGPT 有什么区别? 1.3 它能帮你做什么? 二、安装前的准备工作 2.1 你需要准备什么? 2.2 确认你的…

作者头像 李华
网站建设 2026/4/18 9:22:21

Highcharts 组合图

Highcharts 组合图 概述 Highcharts 是一个功能强大的 JavaScript 图表库,它能够帮助开发者轻松地创建各种类型的图表,包括组合图。组合图是一种将不同类型的图表元素(如柱状图、折线图、饼图等)组合在一起的图表,用于展示数据之间的关系和趋势。本文将详细介绍 Highcha…

作者头像 李华
网站建设 2026/4/18 9:21:22

基于Simulink的车与车(V2V)通信仿真(信息交互场景)

目录 手把手教你学Simulink 一、引言:为什么“智能汽车需要V2V”? 二、V2V 系统架构总览 每辆车包含: 三、BSM 消息结构(SAE J2735 标准简化版) 四、V2V 通信关键参数(基于 DSRC / C-V2X) 五、无线信道建模:路径损耗 + 阴影衰落 六、误码率(BER)与丢包率(PE…

作者头像 李华