文章目录
- 一、方式一: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 在运行时会:
- 优先从容器环境变量读取对应名称
- 如果未设置该变量,则回退使用指定的默认值
这种机制实现了配置与代码分离、不同环境灵活覆盖的目的。
🚀 最佳实践建议
✔ 部署生产环境时尽量不要直接在版本控制写敏感信息
✔ 对于更高安全性,考虑用Docker Secrets / Kubernetes Secrets替代普通环境变量
✔ Compose 配合.env+environment使用更规范、更易维护