Spring Boot无法读取docker-compose环境变量问题求助
Spring Boot 3.1.5 + Docker Compose:环境变量占位符未生效问题
问题描述
使用Docker Compose部署Spring Boot 3.1.5应用时,已在docker-compose.yml中为backend服务配置EUREKA_URL和MONGO_URL环境变量,且容器内已确认变量存在,但Spring Boot仍使用application.yml中占位符的默认值(localhost),导致无法连接Eureka和MongoDB服务。
相关配置代码
application.yml
eureka: client: service-url: default-zone: http://${EUREKA_URL:localhost}:8761/eureka instance: prefer-ip-address: true server: port: 8080 spring: application: name: gamestore-backend data: mongodb: database: gamestore host: ${MONGO_URL:localhost} port: 27017 servlet: multipart: max-file-size: 2GB max-request-size: 2GB
Dockerfile
FROM openjdk:17-oracle COPY target/backend-0.0.1-SNAPSHOT.jar backend-0.0.1-SNAPSHOT.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/backend-0.0.1-SNAPSHOT.jar"]
docker-compose.yml
volumes: mongo-volume: driver: local networks: springnet: name: springnet driver: bridge services: mongo: container_name: mongo image: mongo restart: always ports: - 27017:27017 volumes: - mongo-volume:/etc/mongo networks: - springnet eureka: container_name: eureka image: eureka restart: always ports: - 8761:8761 networks: - springnet backend: container_name: backend image: backend restart: always ports: - 8080:8080 networks: - springnet depends_on: - eureka - mongo environment: EUREKA_URL: eureka MONGO_URL: mongo
验证信息
- 容器内环境变量已存在:
"Env": [ "EUREKA_URL=eureka", "MONGO_URL=mongo", "PATH=/usr/java/openjdk-17/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "JAVA_HOME=/usr/java/openjdk-17", "LANG=C.UTF-8", "JAVA_VERSION=17.0.2" ]
- 错误日志片段:
Caused by: org.apache.hc.client5.http.HttpHostConnectException: Connect to http://localhost:8761 [localhost/127.0.0.1] failed: Connection refused
解决方案
1. 调整Docker启动命令,显式传递配置参数
修改Dockerfile的ENTRYPOINT,直接在启动命令中指定配置项,强制覆盖默认值:
FROM openjdk:17-oracle COPY target/backend-0.0.1-SNAPSHOT.jar backend-0.0.1-SNAPSHOT.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/backend-0.0.1-SNAPSHOT.jar", \ "--eureka.client.service-url.default-zone=http://${EUREKA_URL:localhost}:8761/eureka", \ "--spring.data.mongodb.host=${MONGO_URL:localhost}"]
2. 使用SPRING_APPLICATION_JSON统一传递配置
在docker-compose.yml的backend服务environment中添加SPRING_APPLICATION_JSON,直接以JSON格式注入配置,优先级高于application.yml:
backend: # ... 其他配置不变 environment: EUREKA_URL: eureka MONGO_URL: mongo SPRING_APPLICATION_JSON: >- { "eureka": { "client": { "service-url": { "default-zone": "http://eureka:8761/eureka" } } }, "spring": { "data": { "mongodb": { "host": "mongo" } } } }
3. 检查Spring Boot配置加载优先级
- 确认项目中不存在优先级更高的配置文件(如
bootstrap.yml、application-prod.yml),这类文件会覆盖application.yml的配置。若使用Spring Cloud,需确保bootstrap.yml中也使用相应的环境变量占位符。 - 验证是否有命令行参数、系统属性等其他配置源覆盖了环境变量的配置。
4. 启用调试日志排查配置加载过程
在docker-compose.yml的backend服务中添加调试日志配置,查看Spring是否正确读取环境变量:
backend: # ... 其他配置不变 environment: # ... 其他变量不变 LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CORE_ENV: DEBUG
启动后查看日志,确认Spring是否加载到EUREKA_URL和MONGO_URL变量,以及对应的配置值是否正确替换。
内容的提问来源于stack exchange,提问作者samax
相关产品推荐
相关产品推荐

