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]
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.