You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 00:13:18