通过Spring Boot应用连接到Docker Compose的MongoDB

6

我的Web应用无法连接到MongoDB容器

这是我的application.yml文件

spring:
  data:
    mongodb:
      uri: mongodb://mongo:27017
      host: mongo
      port: 27017
      database: my-db-name

这是我的Docker-Compose文件

version: "3"
services:

  java:
    build:
      context: ./
    ports:
      - "8080:8080"
    links:
      - mongo
    depends_on:
      - mongo
    networks:
      - shared-net

  mongo:
    image: 'mongo'
    ports:
      - 27017:27017
    hostname: mongo
    volumes:
      - ./data/db:/data/db
    networks:
      - shared-net

networks:
  shared-net:
    driver: bridge

这是一个用于运行Java的Dockerfile。
FROM openjdk:11
COPY ./code/lemon-backend/target/lemon-0.0.1-SNAPSHOT.jar /usr/src/
WORKDIR /usr/src/
EXPOSE 8080
CMD ["java", "-jar", "lemon-0.0.1-SNAPSHOT.jar"]

我甚至不能使用这些选项构建应用程序

我遇到了这个异常:

org.mongodb.driver.cluster: 在连接服务器mongo:27017的监视线程中发生异常

如果可能,请尝试使用docker-compose提供解决方案,谢谢。


1
这种情况的常见原因是应用程序在数据库完全准备好之前启动;虽然Compose会按顺序启动服务,但它无法知道何时一个服务已经“准备就绪”。如果您再次运行docker-compose up,一分钟后是否可以正常工作? - David Maze
不行,我甚至尝试了docker-compose up -d db只运行数据库,稍后再运行应用程序。 - Farhad
除此之外,我还有depends_on属性,使得数据库服务先启动。 - Farhad
1个回答

11

翻译版本 ANSWER

重要提示: 旧版 MongoDB 忽略 application.properties 中的此配置,请继续使用我添加的新解决方案。


这个解决方法用于旧版本的 Spring 和 MongoDB,如果不是 uri 的正常配置被忽略。

我收到一个无法解析此属性的警告,但幸运的是它起作用了 :)

dockerspring.data.mongodb.uri= mongodb://<your_mongodb_container_name>:27017/<name_of_your_db>

mongodb部分不可更改,但端口号前的mongo实际上是您在docker-compose中指定的容器名称


SPRING BOOT解决方案

spring:
  data:
    mongodb:
      host: <mongo-db-container-name>
      port: <mongo-db-port>
      database: <database-name>

DOCKER解决方案

在你的Dockerfile中添加这个选项以执行Java

ENTRYPOINT [“java”,”-Dspring.data.mongodb.uri=mongodb://mongo:27017/name_of_your_db”, “-Djava.security.egd=file:/dev/./urandom”,”-jar”,”/<name_of_your_app>.jar”]

链接Java和Mongo容器并给它们命名

这是我的最终docker-compose.yml文件,希望它能对你有所帮助。

version: "3"
services:

  java:
    build:
      context: ./
    ports:
      - "8080:8080"
    container_name: java
    links:
      - mongo
    depends_on:
      - mongo
    networks:
      - shared-net
 
 mongo:
    image: 'mongo'
    ports:
      - 27017:27017
    container_name: mongo
    volumes:
      - /home/sinoed/data/db:/data/db
    networks:
      - shared-net

networks:
  shared-net:
    driver: bridge

请仔细比较这个版本和问题中指定的那个版本


太好了!感谢您分享解决方案!我遇到了同样的问题,并通过应用您的建议进行了修复。我想要补充的是,DB主机(在Dockerfile和Java应用程序URL属性文件中指定)不一定命名为“mongo”;如果在您的Docker compose中,您将容器(container_name属性)命名为mongo_whatever,则那就是您需要使用的主机名。感谢您发布这篇文章。 - Thisisalexis
1
很高兴这个有用。是的,你说得对,我在docker-compose.yml中使用了container_name,但是我忘记在答案中提到它了。谢谢你提醒我,我会编辑答案。 - Farhad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接