Search code examples
spring-bootelasticsearchdocker-compose

Docker Compose Spring Boot is not connecting to Elastic Search container


My Spring Boot backend application was working with Elastic Search container by connection to http://localhost:9200 before just fine. But when I dockerized my whole project my Spring Boot backend doesn't connect to Elastic Search container. I checked and elastic search container was working.

My docker-compose file below:

version: '1'
services:
  db:
    image: mysql:latest
    container_name: db
    environment:
      - MYSQL_DATABASE=hiretalent
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_USER=admin
      - MYSQL_PASSWORD=root
      - MYSQL_PORT=3306
    volumes:
      - /hiretalent-data:/var/lib/mysql
    networks:
      - mynet

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.12
    container_name: elasticsearch
    ports:
      - 9200:9200
      - 9300:9300
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
      - bootstrap.memory_lock=true
    networks:
      - mynet

  backend:
    container_name: hiretalent-backend
    build:
      context: ./backend/hiretalent
      dockerfile: Dockerfile
    restart: on-failure
    depends_on:
      - db
      - selenium
      - elasticsearch
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/hiretalent?createDatabaseIfNotExist=true&autoReconnect=true
      - SPRING_DATASOURCE_USERNAME=admin
      - SPRING_DATASOURCE_PASSWORD=root
      - SPRING_DATA_ELASTICSEARCH_CLUSTER_NODES=elasticsearch:9200
    networks:
      - mynet
    ports:
      - 8080:8080

networks:
  mynet:
    driver: bridge

EDITED: Here is the stack trace. It just doesn't connect...

backend        | Caused by: org.springframework.dao.DataAccessResourceFailureException: Connection refused
backend        |        at org.springframework.data.elasticsearch.client.elc.ElasticsearchExceptionTranslator.translateExceptionIfPossible(ElasticsearchExceptionTranslator.java:107) ~[spring-data-elasticsearch-5.1.1.jar!/:5.1.1]
backend        |        at org.springframework.data.elasticsearch.client.elc.ElasticsearchExceptionTranslator.translateException(ElasticsearchExceptionTranslator.java:63) ~[spring-data-elasticsearch-5.1.1.jar!/:5.1.1]
backend        |        at org.springframework.data.elasticsearch.client.elc.ChildTemplate.execute(ChildTemplate.java:73) ~[spring-data-elasticsearch-5.1.1.jar!/:5.1.1]
backend        |        at org.springframework.data.elasticsearch.client.elc.IndicesTemplate.doExists(IndicesTemplate.java:177) ~[spring-data-elasticsearch-5.1.1.jar!/:5.1.1]
backend        |        at org.springframework.data.elasticsearch.client.elc.IndicesTemplate.exists(IndicesTemplate.java:169) ~[spring-data-elasticsearch-5.1.1.jar!/:5.1.1]
backend        |        at org.springframework.data.elasticsearch.repository.support.SimpleElasticsearchRepository.<init>(SimpleElasticsearchRepository.java:83) ~[spring-data-elasticsearch-5.1.1.jar!/:5.1.1]
backend        |        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]
backend        |        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[na:na]
backend        |        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na]
backend        |        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[na:na]
backend        |        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[na:na]
backend        |        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:211) ~[spring-beans-6.0.10.jar!/:6.0.10]
backend        |        ... 128 common frames omitted
backend        | Caused by: java.lang.RuntimeException: Connection refused
backend        |        at org.springframework.data.elasticsearch.client.elc.ElasticsearchExceptionTranslator.translateException(ElasticsearchExceptionTranslator.java:62) ~[spring-data-elasticsearch-5.1.1.jar!/:5.1.1]
backend        |        ... 138 common frames omitted
backend        | Caused by: java.net.ConnectException: Connection refused
backend        |        at org.elasticsearch.client.RestClient.extractAndWrapCause(RestClient.java:930) ~[elasticsearch-rest-client-8.7.1.jar!/:8.7.1]
backend        |        at org.elasticsearch.client.RestClient.performRequest(RestClient.java:300) ~[elasticsearch-rest-client-8.7.1.jar!/:8.7.1]
backend        |        at org.elasticsearch.client.RestClient.performRequest(RestClient.java:288) ~[elasticsearch-rest-client-8.7.1.jar!/:8.7.1]
backend        |        at co.elastic.clients.transport.rest_client.RestClientTransport.performRequest(RestClientTransport.java:153) ~[elasticsearch-java-8.7.1.jar!/:na]
backend        |        at co.elastic.clients.elasticsearch.indices.ElasticsearchIndicesClient.exists(ElasticsearchIndicesClient.java:620) ~[elasticsearch-java-8.7.1.jar!/:na]
backend        |        at org.springframework.data.elasticsearch.client.elc.IndicesTemplate.lambda$doExists$2(IndicesTemplate.java:177) ~[spring-data-elasticsearch-5.1.1.jar!/:5.1.1]
backend        |        at org.springframework.data.elasticsearch.client.elc.ChildTemplate.execute(ChildTemplate.java:71) ~[spring-data-elasticsearch-5.1.1.jar!/:5.1.1]
backend        |        ... 137 common frames omitted
backend        | Caused by: java.net.ConnectException: Connection refused
backend        |        at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
backend        |        at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) ~[na:na]
backend        |        at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:946) ~[na:na]
backend        |        at org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor.processEvent(DefaultConnectingIOReactor.java:174) ~[httpcore-nio-4.4.16.jar!/:4.4.16]
backend        |        at org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor.processEvents(DefaultConnectingIOReactor.java:148) ~[httpcore-nio-4.4.16.jar!/:4.4.16]
backend        |        at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor.execute(AbstractMultiworkerIOReactor.java:351) ~[httpcore-nio-4.4.16.jar!/:4.4.16]
backend        |        at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.execute(PoolingNHttpClientConnectionManager.java:221) ~[httpasyncclient-4.1.5.jar!/:4.1.5]
backend        |        at org.apache.http.impl.nio.client.CloseableHttpAsyncClientBase$1.run(CloseableHttpAsyncClientBase.java:64) ~[httpasyncclient-4.1.5.jar!/:4.1.5]
backend        |        at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]

Solution

  • After browsing all of the internet I finally find the solution, turns out default value for "spring.elasticsearch.uris" is localhost:9200 and my container was trying to connect to nonexistent host all along. I added "SPRING_ELASTICSEARCH_URIS=elasticsearch:9200" to my backend environment in docker compose and now it's working perfectly fine.