Spring Boot忽略环境变量:无法连接Eureka容器问题排查
应用无法连接Eureka容器,仍尝试访问localhost的问题
环境配置
Docker Compose 文件
version: '2.1' services: app: build: context: . dockerfile: Dockerfile ports: - "8100:8100" depends_on: eureka: condition: service_healthy environment: EUREKA_URL: http://eureka:8761/eureka eureka: image: nadchel/eureka-server:1.0 ports: - "8761:8761" healthcheck: test: ["CMD-SHELL", "curl -f http://eureka:8761"] interval: 10s timeout: 10s retries: 10
应用POM依赖配置
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>token-service</artifactId> <version>0.0.1-SNAPSHOT</version> <name>token-service</name> <description>token-service</description> <properties> <java.version>17</java.version> <spring-cloud.version>2023.0.0</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- ... --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
应用配置文件
spring: application: name: token-service eureka: client: availability-zones: defaultZone: ${EUREKA_URL:http://localhost:8761/eureka}
问题现象
应用启动后无法连接Eureka容器,日志报错如下:
token-service-app-1 | 2024-02-21T23:41:51.863Z WARN 1 --- [token-service] [nfoReplicator-0] c.n.d.s.t.d.RetryableEurekaHttpClient : Request execution failed with message: I/O error on POST request for "http://localhost:8761/eureka/apps/TOKEN-SERVICE": Connect to http://localhost:8761 [localhost/127.0.0.1] failed: Connection refused
明明已经通过环境变量传入http://eureka:8761/eureka,且配置文件中引用了该变量,但应用仍尝试访问localhost。
已排查情况
- 环境变量格式验证:Docker Compose中的environment格式符合官方规范,示例参考:
environment: RACK_ENV: development SHOW: 'true' SESSION_SECRET: - 容器内环境变量确认:进入app容器执行
env命令,已确认EUREKA_URL=http://eureka:8761/eureka存在:docker exec token-service-app-1 /bin/sh -c "env" POSTGRES_USERNAME=postgres HOSTNAME=2e671f5bd313 SHLVL=1 HOME=/root EUREKA_URL=http://eureka:8761/eureka POSTGRES_PASSWORD=postgres PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/default-jvm/bin LANG=C.UTF-8 POSTGRES_URL=jdbc:postgresql://db:5432/postgres JAVA_HOME=/usr/lib/jvm/default-jvm PWD=/app - 版本差异排查:对比了Eureka服务的版本,其使用Spring Boot 3.1.3和Spring Cloud 2022.0.4,与当前应用的版本存在差异,但其他同版本差异的服务可正常运行:
<!-- Eureka的pom:Boot和Cloud版本稍旧 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>EurekaServer</artifactId> <version>0.0.1-SNAPSHOT</version> <name>EurekaServer</name> <description>EurekaServer</description> <properties> <java.version>17</java.version> <spring-cloud.version>2022.0.4</spring-cloud.version>
内容的提问来源于stack exchange,提问作者Sergey Zolotarev
相关产品推荐
相关产品推荐

