Spring Cloud Config in Docker container is not accessible

家住魔仙堡 提交于 2021-02-08 03:41:20

问题


I have a relatively simple setup. A Spring Could Config server, and a Spring Cloud Eureka server. (I refer Eureka server as Discover everywhere in my config...) The config server uses a Git repository for finding the appropriate config.

Everything is in Docker containers. I use docker-compose to build my services. The Gateway server should wait for config server to come up. I'll provide the source of the file further down.

So, when I build and start the containers, the discovery (Eureka) server doesn't want to come up. It exits with an exception. It is really long, so I just add the most important part here:

019-01-27 23:52:17,494 [INFO  ] o.s.c.c.c.ConfigServicePropertySourceLocator.getRemoteEnvironment [main] – Fetching config from server at : http://tao-elszamolas-config:9001
2019-01-27 23:52:17,898 [INFO  ] o.s.c.c.c.ConfigServicePropertySourceLocator.getRemoteEnvironment [main] – Connect Timeout Exception on Url - http://tao-elszamolas-config:9001. Will be trying the next url if available
2019-01-27 23:52:17,902 [ERROR ] o.s.b.SpringApplication.reportFailure [main] – Application run failed
java.lang.IllegalStateException: Could not locate PropertySource and the fail fast property is set, failing
... Something...Something
Caused by: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://tao-elszamolas-config:9001/discovery-server/prod": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:743) ~[spring-web-5.1.3.RELEASE.jar!/:5.1.3.RELEASE]
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:669) ~[spring-web-5.1.3.RELEASE.jar!/:5.1.3.RELEASE]
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:578) ~[spring-web-5.1.3.RELEASE.jar!/:5.1.3.RELEASE]
    at org.springframework.cloud.config.client.ConfigServicePropertySourceLocator.getRemoteEnvironment(ConfigServicePropertySourceLocator.java:218) ~[spring-cloud-config-client-2.1.0.RC3.jar!/:2.1.0.RC3]
    at org.springframework.cloud.config.client.ConfigServicePropertySourceLocator.locate(ConfigServicePropertySourceLocator.java:96) ~[spring-cloud-config-client-2.1.0.RC3.jar!/:2.1.0.RC3]
    ... 15 more
Caused by: java.net.ConnectException: Connection refused (Connection refused)
    at java.net.PlainSocketImpl.socketConnect(Native Method) ~[?:?]
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399) ~[?:?]
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242) ~[?:?]
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224) ~[?:?]
    at java.net.Socket.connect(Socket.java:591) ~[?:?]
    at java.net.Socket.connect(Socket.java:540) ~[?:?]
    at sun.net.NetworkClient.doConnect(NetworkClient.java:182) ~[?:?]
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:474) ~[?:?]
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:569) ~[?:?]
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242) ~[?:?]
    at sun.net.www.http.HttpClient.New(HttpClient.java:341) ~[?:?]
    at sun.net.www.http.HttpClient.New(HttpClient.java:362) ~[?:?]
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1242) ~[?:?]
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1181) ~[?:?]
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1075) ~[?:?]
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:1009) ~[?:?]
    at org.springframework.http.client.SimpleBufferingClientHttpRequest.executeInternal(SimpleBufferingClientHttpRequest.java:76) ~[spring-web-5.1.3.RELEASE.jar!/:5.1.3.RELEASE]
    at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) ~[spring-web-5.1.3.RELEASE.jar!/:5.1.3.RELEASE]
    at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53) ~[spring-web-5.1.3.RELEASE.jar!/:5.1.3.RELEASE]
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:734) ~[spring-web-5.1.3.RELEASE.jar!/:5.1.3.RELEASE]
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:669) ~[spring-web-5.1.3.RELEASE.jar!/:5.1.3.RELEASE]
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:578) ~[spring-web-5.1.3.RELEASE.jar!/:5.1.3.RELEASE]
    at org.springframework.cloud.config.client.ConfigServicePropertySourceLocator.getRemoteEnvironment(ConfigServicePropertySourceLocator.java:218) ~[spring-cloud-config-client-2.1.0.RC3.jar!/:2.1.0.RC3]
    at org.springframework.cloud.config.client.ConfigServicePropertySourceLocator.locate(ConfigServicePropertySourceLocator.java:96) ~[spring-cloud-config-client-2.1.0.RC3.jar!/:2.1.0.RC3]
    ... 15 more

The only exception what I found in the Config server log is the one complaining about the connection to Discovery (Eureka) server. Yes, I try to register my config service inEureka for looking it up at startup of further microservices.

The connection is refused which means, the config server is not running at the time when Eureka server is trying to get its config or it is not listening on the given port, 9001.

How is it possible? I used the depends_on in my compose file, so it should wait for that.

Or why it finishes working? If I do the same thing on local without docker then it keeps trying to connect to Config, until the config server starts up. I'd like achieve the same behaviour using Docker.

Any advice would be appreciated!

And finally here are my config files:

docker-compose.yml:

 version: "3"
   services:           
     tao-elszamolas-config:
       build: ./tao-elszamolas-config
       container_name: tao-elszamolas-config
       ports:
         - "9001:9001"
       volumes:
         - "/tao-elszamolas/logs:/var/log/tao-elszamolas"
       networks:
         - taonetwork

       tao-elszamolas-discovery:
         build: ./tao-elszamolas-discovery
         container_name: tao-elszamolas-discovery
         depends_on:
           - tao-elszamolas-config
         ports:
           - "9002:9002"
         volumes:
           - "/tao-elszamolas/logs:/var/log/tao-elszamolas"
         networks:
           - taonetwork

   networks:
     taonetwork:
       driver: bridge

Dockerfile of Config Server:

 FROM openjdk:11-jdk-slim
 MAINTAINER BeszterceKK
 COPY ./tao-elszamolas-config.jar /usr/src/taoelszamolas/tao-elszamolas-config.jar
 WORKDIR /var/log/tao-elszamolas
 WORKDIR /usr/src/taoelszamolas
 ENV SPRING_PROFILES_ACTIVE prod
 EXPOSE 9001
 ENTRYPOINT ["java", "-DlogFileLocation=/var/log/tao-elszamolas", "-jar", "tao-elszamolas-config.jar"]

application.yml for Config server:

server:
  port: 9001

spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/something/something
          username: something
          password: something
          skip-ssl-validation: true
  security:
    user:
      name: something
      password: something

eureka:  
  client:
    serviceUrl:
      defaultZone: http://something:something@tao-elszamolas-discovery:9002/eureka/


info:
  artifact: tao-elszamolas-config
  name: TAO Elszamolas Config Application
  description: Tao elszamolas microservice elosztott szolgaltatas konfiguracio
  version: 1.0.0

Dockerfile of Discovery (Eureka) Server:

FROM openjdk:11-jdk-slim
MAINTAINER BeszterceKK
COPY ./tao-elszamolas-discovery.jar /usr/src/taoelszamolas/tao-elszamolas-discovery.jar
WORKDIR /var/log/tao-elszamolas
WORKDIR /usr/src/taoelszamolas
ENV SPRING_PROFILES_ACTIVE prod
EXPOSE 9002
ENTRYPOINT ["java", "-DlogFileLocation=/var/log/tao-elszamolas", "-jar", "tao-elszamolas-discovery.jar"]

bootstrap.yml for Discovery (Eureka) server:

spring:
  application:
    name: discovery-server
  cloud:
    config:
      fail-fast: true
      name: discovery-server
      uri: http://tao-elszamolas-config:9001
      username: something
      password: something

application.yml for Discovery (Eureka) server:

server:
  port: 9002

eureka:
  instance:
    hostname: tao-elszamolas-discovery
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://tao-elszamolas-discovery:9002/eureka

info:
  artifact: tao-elszamolas-discovery
  name: TAO Elszamolas Eureka Szolgaltatas monitor
  description: Tao elszamolas automatikus szolgaltatas regisztracio
  version: 1.0.0

And finally, this is how I start my containers. It is simply:

docker-compose up -d

The whole application stack works on local without Docker. So I guess the problem is with my Docker configuration.

One more thing to mention, generally, I don't want to publish the ports to host, only expose them on my custom network between the containers. This is why I tried to replace the PORTS with EXPOSE, but it didn't really help.


回答1:


for startup Compose does not wait until a container is “ready” (whatever that means for your particular application) - only until it’s running

So, you should refer : https://docs.docker.com/compose/startup-order/

for wait until for config server container is ready first (already listened on port 9001), then starting Eureka server container.




回答2:


You registry service try to start before configuration service is up. You have to force him to wait. You can do it with condition: service_started, like below. But I think it is not working with version 3

version: '2.1'

# ...

tao-elszamolas-discovery:
    build: ./tao-elszamolas-discovery
    container_name: tao-elszamolas-discovery
    depends_on:
        - tao-elszamolas-config:
            condition: service_started
    ports:
        - "9002:9002"
    volumes:
        - "/tao-elszamolas/logs:/var/log/tao-elszamolas"
    networks:
        - taonetwork

A solution for version 3 is to use healthcheck and restart: on-failure Take a look at this post

Another solution is to use entrypoint section to launch a batch file at start which is pinging configuration service container while it is not responding.



来源:https://stackoverflow.com/questions/54394627/spring-cloud-config-in-docker-container-is-not-accessible

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!