Spring Boot中docker-compose与application.yml读取.env文件的疑问
Spring Boot部署中.env、docker-compose与application.yml变量配置疑问解答
给定配置文件
.env 文件
DB_NAME=employee_db DB_USERNAME=postgres DB_PASSWORD=pass JWT_SECRET=mySecretKey
docker-compose.yml 文件
version: '3.8' services: db: container_name: employee-db image: postgres:14.6-alpine env_file: ./.env environment: POSTGRES_DB: ${DB_NAME} POSTGRES_USER: ${DB_USERNAME} POSTGRES_PASSWORD: ${DB_PASSWORD}
application.yml 文件
spring: ... code omitted for brevity datasource: driver-class-name: org.postgresql.Driver url: jdbc:postgresql://localhost:5432/${DB_NAME} username: ${DB_USERNAME} password: ${DB_PASSWORD} app: security: jwtSecret: ${JWT_SECRET}
疑问解答
1. .env文件是否由docker-compose读取,并以此创建数据库?
是的。
- docker-compose启动时会自动读取当前目录下的
.env文件,将其中的变量加载到自身环境中。 - 你的
docker-compose.yml里,db服务通过env_file: ./.env显式加载了.env文件,同时在environment字段用${DB_NAME}等占位符引用变量,这些变量会传递给postgres容器。 - postgres官方镜像会识别
POSTGRES_DB、POSTGRES_USER、POSTGRES_PASSWORD这几个环境变量,启动时自动创建指定名称的数据库、对应用户并设置密码。
2. 应用运行时使用application.yml,若未传入环境变量,DB_USERNAME等值是否会从.env文件读取?
分两种场景:
场景1:Spring Boot应用直接在本地运行(未通过docker-compose管理)
默认情况下Spring Boot不会自动读取.env文件,application.yml中的${DB_USERNAME}等占位符找不到对应值,会导致应用启动失败。如果想让本地运行的应用读取.env,需要额外配置,比如添加spring-boot-starter-cloud-config依赖,或者在启动类上用@PropertySource注解指定加载.env文件。场景2:Spring Boot应用通过docker-compose作为服务运行
如果在docker-compose中给Spring Boot服务添加env_file: ./.env配置,容器内的应用会获取到这些环境变量,application.yml中的占位符会被自动替换,不需要额外传入环境变量。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

