Сервер Spring Cloud Config не работает с Docker Compose

У меня есть сервер облачной конфигурации Spring и я упаковал его как образ докера, затем у меня есть сервер Spring Cloud Eureka, который также упакован как образ докера.

Когда я запускаю их с помощью docker compose, я получаю следующую ошибку.

discovery-service_1 | 2017-06-24 15:36:12.059 INFO 5 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at: http://config-service:9001 discovery-service_1 | 2017-06-24 15:36:12.997 WARN 5 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Could not locate PropertySource: I/O error on GET request for "http://config-service:9001/cls-discovery-service/default": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)

Несмотря на то, что служба конфигурации успешно запущена, служба обнаружения по какой-то причине все еще не находит ее.

Здесь используется файл составления Docker version: '2' services: config-service: image: cloudsea/cls-config-service ports: - 9001:9001 expose: - "9001" discovery-service: image: cloudsea/cls-discovery-service depends_on: - config-service environment: CLOUD_SEA_CONFIG_SERVER_URI: http://config-service:9001 EUREKA_DEFAULT_ZONE_URL: http://discovery-service:8761/eureka/ ports: - 8761:8761 links: - config-service:config-service

Ниже приведен bootstrap.properties для DISCOVERY SERVICE.

spring.cloud.config.uri = ${CLOUD_SEA_CONFIG_SERVER_URI:http://localhost:9001} spring.application.name = ${SPRING_APPLICATION_NAME:cls-discovery-service}

Ниже приведен cls-discovery-service.properties для DISCOVERY SERVICE, расположенный на github.

server.port=${SERVER_PORT:8761} eureka.client.registerWithEureka: false eureka.client.fetchRegistry: false eureka.client.serviceUrl.defaultZone: ${EUREKA_DEFAULT_ZONE_URL:http://localhost:8761/eureka/} eureka.server.eviction-interval-timer-in-ms: 1000

Я предполагаю, что с моим docker-compose.yml что-то не так, но я не уверен.

Любая помощь, я буду придерживаться этого часами ... приближаясь к дням :(


comment
Как насчет запуска образа докера отдельно? сначала запустить службу конфигурации, а затем службу обнаружения?   -  person Liping Huang    schedule 25.06.2017
comment
Если я это сделаю, он будет работать отлично, но проблема в том, что я должен затем указать uri конфигурации как http://DOCKER_HOST:9001. Я предполагаю, что проблема связана с составлением докеров, но не знаю, что это такое ???   -  person Shahbaz    schedule 25.06.2017


Ответы (3)


Я решил это, добавив эту конфигурацию в файл bootstrap.yml службы обнаружения.

spring:
  cloud:
    config:
      failFast: true
      retry:
        initialInterval: 3000
        multiplier: 1.3
        maxInterval: 5000
        maxAttempts: 20

Затем добавьте spring-boot-starter-aop и spring-retry к зависимостям maven службы обнаружения.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
    <version>${spring-boot-starter-aop.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>${spring-retry.version}</version>
</dependency>

Проблема в том, что они оба запускаются одновременно. Но служба обнаружения зависит от службы конфигурации.

Когда вы запускаете службу обнаружения, она будет повторять "Получение конфигурации с сервера" снова и снова, пока служба конфигурации не будет запущена.

После запуска службы конфигурации служба обнаружения успешно получит свою конфигурацию, а затем запустится сама.

person Enes Korukcu    schedule 11.10.2017
comment
Я два дня сталкиваюсь с этой проблемой, поэтому я нашел ответ, большое спасибо. - person natanaelfonseca; 27.12.2018

Проблема в том, что весь контейнер докеров запускается вместе, но в соответствии с вашей архитектурой сначала должна запускаться служба конфигурации, а затем служба обнаружения (эврика). Итак, служба обнаружения выдает ошибку.

depends_on не ждет, пока служба конфигурации будет «готова» перед запуском службы обнаружения - она ​​только ждет, пока она не будет запущена. Если вам нужно подождать, пока служба будет готова, вы должны использовать управление порядком запуска.

В соответствии с предложением вы можете настроить API / службы для повторения попыток через определенные промежутки времени, пока не будет запущен сервер конфигурации.

Тем не менее, я бы также предпочел использовать depends_on или healthcheck и контролировать порядок запуска, как показано ниже:

version: "2"
services:
  web:
    build: .
    ports:
      - "80:8000"
    depends_on:
      - "db"
    command: ["./wait-for-it.sh", "db:5432", "--", "python", "app.py"]
  db:
    image: postgres

wait-for-it.sh - это чистый сценарий bash, который ожидает доступности. Я также предлагаю изучить инструменты оркестровки контейнеров, такие как docker-swarm или kubernetes.

person madhu pathy    schedule 06.02.2018

Я столкнулся с той же проблемой и ненадолго застрял, и я собирался пойти по тому же маршруту, что и вы с повторной попыткой пружины, что неплохой шаблон для следования, он действительно обеспечивает отказоустойчивость в вашем приложении, но основная проблема вот порядок запуска докеров неуместен. Я поделюсь своим рабочим файлом docker-compose, он очень похож, но ключевым здесь является параметр «depends_on». Я добавил цитаты из своих аргументов, и, похоже, это сработало.

version: "2"
services:
  eureka:
    image: eurekatest
    ports:
    - "8761:8761"

  config: 
    image: config
    ports:
    - "8888:8888"
    links:
    - eureka:eureka
    depends_on:
    - "eureka"

person Twesh Chowdhury    schedule 13.12.2017