docker容器部署springcloud微服务+config-server+hosts的坑

docker容器启动微服务可以使用-v /etc/hosts:/etc/hosts 这种方式使得容器内的hosts和宿主机的hosts同步从而获得hosts。如果不适用config-server,完全不存在问题。

spring:
  application:
    name: user-manage
  cloud:
       config:
         profile: dev
         #label: master
         #uri: 
         #fail-fast: true    #无法链接到config-server时快速返回失败。
         password: 123456    #访问config-server端点获取配置信息所需的用户名密码。SpringSecurity
         username: safebox
         discovery:
           service-id: config-server
           enabled: true   #通过服务名称访问config-server,不直接通uri,方便以后实现高可用
server:
  port: 8019
eureka:
  client:
    service-url:
      defaultZone: http://eureka.safebox.com:8761/eureka/
  instance:
        prefer-ip-address: true
        instance-id: ${spring.cloud.client.ip-address}:${server.port}

但是

使用config-server并且指定根据serviceId来找到config-server那就会报错,获取不到配置信息,查看控制台,一直是fetch localhost:8888。说配置没起作用。问题在哪呢?

之前运行其他微服务的时候,就发现,服务启动时候并不会第一时间识别到hosts,每次启动后,过一会才能找到hosts,估计是容器启动会先读配置文件,启动服务,然后再去从宿主机加载 hosts,所以导致第一时间无法注册到eureka,从而无法获取config-server的路径,无法获取配置信息,导致服务启动失败。

补充:期间考虑过只指定一个eureka的host,结合/etc/hosts,但是失败。还是会直接去找本地8888端口。

解决:可以不使用/etc/hosts和宿主机的映射。而在启动容器的时候手动指定所有hosts,–add-host h o s t . n a m e : {host.name}: host.name:{host.ip} 。这种方式会很麻烦,启动命令会很长,所以考虑使用shell脚本或者docker compose。

未完待续。。。。。。。

你可能感兴趣的:(spring,boot)