news 2026/5/10 19:35:56

深入解析 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/5/10 11:20:11

模板代码生成原理

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

作者头像 李华
网站建设 2026/5/10 12:33:00

C++中的组合模式

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

作者头像 李华
网站建设 2026/5/10 12:32:48

高性能计算缓存优化

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

作者头像 李华
网站建设 2026/5/10 2:25:29

使用Python处理计算机图形学(PIL/Pillow)

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

作者头像 李华
网站建设 2026/5/10 12:32:48

模板编译期条件分支

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

作者头像 李华
网站建设 2026/5/10 12:32:54

8个常见错误及避免方法,优化YashanDB数据库使用

在现代信息技术中,数据库的性能和可靠性对企业运营至关重要。如何优化查询速度、提高并发处理能力以及确保数据的完整性,成为了信息技术专家关注的焦点。本篇文章通过分析YashanDB使用中常见的8个错误,提出切实可行的避免方法,助力…

作者头像 李华