Java не может получить доступ к Elasticsearch, работающему в Docker в Windows 11

Обновлено: это работает, если я отключу обнюхивание транспортного клиента.

Settings settings = Settings.builder()
                .put("cluster.name", clusterName)
                .put("client.transport.sniff", false)
                .build();

Есть идеи, как это исправить?


Во-первых, в Ubuntu 20.04 все работает нормально, но когда я пытаюсь запустить тот же проект с помощью Docker Desktop в Windows 10, 11 и macOS, происходит сбой.

Когда служба Spring запускается, она пытается найти узел Elasticsearch и терпит неудачу, за исключением следующего:

2022-12-27 16:20:40.459  INFO 23752 --- [           main] o.e.p.PluginsService                     : no modules loaded
2022-12-27 16:20:40.459  INFO 23752 --- [           main] o.e.p.PluginsService                     : loaded plugin [org.elasticsearch.index.reindex.ReindexPlugin]
2022-12-27 16:20:40.460  INFO 23752 --- [           main] o.e.p.PluginsService                     : loaded plugin [org.elasticsearch.join.ParentJoinPlugin]
2022-12-27 16:20:40.460  INFO 23752 --- [           main] o.e.p.PluginsService                     : loaded plugin [org.elasticsearch.percolator.PercolatorPlugin]
2022-12-27 16:20:40.460  INFO 23752 --- [           main] o.e.p.PluginsService                     : loaded plugin [org.elasticsearch.script.mustache.MustachePlugin]
2022-12-27 16:20:40.460  INFO 23752 --- [           main] o.e.p.PluginsService                     : loaded plugin [org.elasticsearch.transport.Netty4Plugin]
2022-12-27 16:21:02.679  INFO 23752 --- [           main] c.u.OnStartup                            : -----> APPLICATION INITIALIZATION <-----
2022-12-27 16:21:02.679  INFO 23752 --- [           main] c.u.OnStartup                            : -----> SETTING TIMEZONE
2022-12-27 16:21:02.679  INFO 23752 --- [           main] c.u.OnStartup                            : -----> CREATE INDEXES AND MAPPINGS NOW
2022-12-27 16:21:02.683 ERROR 23752 --- [           main] c.u.OnStartup                            : Elasticsearch unavailable, skipping creating of indexes

org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: [{#transport#-1}{CA1SJmWMQfe1sRIDTY_Lpw}{localhost}{127.0.0.1:9300}]
    at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.java:347) ~[elasticsearch-6.2.4.jar:6.2.4]
    at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:245) ~[elasticsearch-6.2.4.jar:6.2.4]
    at org.elasticsearch.client.transport.TransportProxyClient.execute(TransportProxyClient.java:60) ~[elasticsearch-6.2.4.jar:6.2.4]
    at org.elasticsearch.client.transport.TransportClient.doExecute(TransportClient.java:371) ~[elasticsearch-6.2.4.jar:6.2.4]
    at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:405) ~[elasticsearch-6.2.4.jar:6.2.4]
    at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:394) ~[elasticsearch-6.2.4.jar:6.2.4]
    at org.elasticsearch.client.support.AbstractClient$IndicesAdmin.execute(AbstractClient.java:1247) ~[elasticsearch-6.2.4.jar:6.2.4]
    at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:46) ~[elasticsearch-6.2.4.jar:6.2.4]
    at com.mymy.service.services.impl.IndexAndTypeManagementServiceImpl.indexExists(IndexAndTypeManagementServiceImpl.java:65) ~[classes/:?]
    at com.mymy.service.services.impl.IndexAndTypeManagementServiceImpl.createIndex(IndexAndTypeManagementServiceImpl.java:95) ~[classes/:?]
    at com.mymy.OnStartup.createIndexes(OnStartup.java:87) ~[classes/:?]
    at com.mymy.OnStartup.init(OnStartup.java:55) ~[classes/:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_352]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_352]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_352]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_352]
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:363) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:307) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:136) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:414) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1770) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) [spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) [spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) [spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:845) [spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877) [spring-context-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) [spring-context-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140) [spring-boot-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:742) [spring-boot-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:389) [spring-boot-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:311) [spring-boot-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at

Файл docker-compose выглядит так:

version: '3.5'

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.2.4
    container_name: elasticsearch
    ports: 
      - 9200:9200
      - 9300:9300
    environment:
      - discovery.type=single-node
      - cluster.name=mycluster
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - xpack.security.enabled=false
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - elastic_data:/usr/share/elasticsearch/data

  kibana:
    image: docker.elastic.co/kibana/kibana:6.2.4
    container_name: kibana
    environment:
      SERVER_NAME: localhost
      ELASTICSEARCH_URL: http://elasticsearch:9200/
    ports:
      - 5601:5601
    volumes: 
      - kibana_data:/var/log
    depends_on: 
      - elasticsearch
volumes:
  elastic_data:
  kibana_data:

Версия Java 1.8. Любое предложение о том, как это исправить?

Elasticsearch доступен через инструменты Elasticsearch в браузере.

Что дает команда «docker ps»?

Mr_Thorynque 27.12.2022 17:05

@Mr_Thorynque Теперь я пытаюсь запустить docker в wsl, те же проблемы, та же видимость: e696e29f7823 docker.elastic.co/kibana/kibana:6.2.4 "/bin/bash /usr/loca…" 31 минут назад Up 6 минут 0.0 .0.0:5601->5601/tcp, :::5601->5601/tcp kibana fdb667b362c8 docker.elastic.co/elasticsearch/elasticsearch:6.2.4 "/usr/local/bin/dock…" 31 минут назад Up 6 минут 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp elasticsearch

user3816378 27.12.2022 17:16

9300, кажется, выставлен на хосте. С помощью wsl вы можете попробовать «nc -vz -w5 127.0.0.1 9300», чтобы проверить порт на локальном хосте.

Mr_Thorynque 27.12.2022 17:22

Подключение к порту 127.0.0.1 9300 [tcp/*] выполнено успешно! Эластичный, кажется, работает, но приложение Java не может его найти

user3816378 27.12.2022 17:26

Итак, как запускается приложение Springboot? Это докер? Если это так, вам нужно настроить его в той же сети, что и док-компоновка эластиков.

Mr_Thorynque 27.12.2022 17:37

Я запускаю Springboot в IntelliJ. Я только что запустил весеннюю загрузочную банку в wsl как java -jar, и она работает таким образом, но не тогда, когда я запускаю ее вне wsl.

user3816378 27.12.2022 17:39

Вы пытались настроить URL-адрес эластиков с 127.0.0.1 вместо localhost в приложении Java?

Mr_Thorynque 27.12.2022 17:44

Может эта ссылка вам поможет jetbrains.com/help/idea/…

Mr_Thorynque 27.12.2022 17:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
8
133
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ответ заключается в том, чтобы добавить следующие переменные среды в файл docker-compose.yaml службы elasticsearch:

environment:
  - discovery.type=single-node
  - network.host=_local_,_site_
  - network.publish_host=_local_

или запустить elasticsearch командой:

command: elasticsearch -Enetwork.host=_local_,_site_ -Enetwork.publish_host=_local_

Решение благодаря https://github.com/olivere/elastic-with-docker/

Другие вопросы по теме