У меня есть приложение Spring Boot, и я разработал его с помощью базы данных mongo, которая работала в сервисах brew.
Чтобы получить соединение с БД, мне просто нужно было поместить следующее в application.properties в Spring Boot
spring.data.mongodb.uri=mongodb://localhost:27017/db
изменение свойств приложения на
spring.data.mongodb.uri=mongodb://mongo:27017/db
ничего не изменил, ошибка та же, что и раньше.
Теперь я пытаюсь поместить приложение SpringBoot и MongoDB в Docker-контейнеры, но не могу заставить работать любое соединение.
Итак, это мой Dockerfile в приложении SpringBoot:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
EXPOSE 8080
ADD /build/libs/dg-0.0.1-SNAPSHOT.jar dg-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/dg-0.0.1-SNAPSHOT.jar"]
Это мой файл Docker-Compose.yml:
version: '3'
services:
mongo:
container_name: docker-mongo
image: mongo:latest
ports:
- "27017:27017"
volumes:
- ./data/db:/data/db
spring:
depends_on:
- mongo
image:
docker-spring-http-alpine
ports:
- "8080:8080"
links:
- mongo
После выполнения Docker-Compose с помощью
docker-compose up
Я получаю следующую ошибку: (это фактическое сообщение об ошибке)
2019-07-08 23:10:19.990 INFO 1 --- [localhost:27017] org.mongodb.driver.cluster: Exception in monitor thread while connecting to server localhost:27017
com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:67) ~[mongodb-driver-core-3.8.2.jar!/:na]
at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:126) ~[mongodb-driver-core-3.8.2.jar!/:na]
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) ~[mongodb-driver-core-3.8.2.jar!/:na]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_212]
Caused by: java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_212]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_212]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_212]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_212]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_212]
at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_212]
at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:64) ~[mongodb-driver-core-3.8.2.jar!/:na]
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:62) ~[mongodb-driver-core-3.8.2.jar!/:na]
... 3 common frames omitted
Кто-нибудь знает, в чем здесь проблема?
В среде разработки это работает как шарм.
Заранее спасибо
Добавление следующей строки в Dockerfile
"-Dspring.data.mongodb.uri=mongodb://mongo:27017/dg"
в Entrypoint, как это решило проблему подключения
ENTRYPOINT ["java", "-Dspring.data.mongodb.uri=mongodb://mongo:27017/dg","-Djava.security.egd=file:/dev/./urandom","-jar","/dg-0.0.1-SNAPSHOT.jar"]
Мне удалось установить соединение с БД без указанной выше строки в Entrypoint в Dockerfile. Я думаю, это если вы хотите подключить свою БД через "ссылки"
Но теперь я смог подключиться по сети, это мой код:
version: '3.6'
services:
mongo:
container_name: docker_mongo
networks:
- gateway
ports:
- "27017:27017"
hostname: mongo
image: mongo:latest
volumes:
- ./data/db:/data/db
spring:
container_name: docker-spring
networks:
- gateway
ports:
- "8080:8080"
hostname: spring
depends_on:
- mongo
image: dg-docker-spring-http-alpine-j
networks:
gateway:
driver: "bridge"
и следующие в свойствах приложения
spring.data.mongodb.host=docker_mongo
spring.data.mongodb.port=27017
spring.data.mongodb.database=db
Похоже, теперь соединение работает по сети.
Тот же код не работал с версией 3.0
Чтобы запретить SpringBoot автоматически подключаться к mongo через localhost, также необходимо исключить MongoAutoConfiguration!
@SpringBootApplication(exclude={MongoAutoConfiguration.class})
Спасибо всем за помощь