java - 如何为 MongoDB 和 Spring Boot 将主机名定义到 docker-compose.yml 中

标签 java mongodb spring-boot docker docker-compose

我正在尝试使用 MongoDB 和 Spring boot 创建 docker-compose.yml。 问题是我不想将任何数据库连接硬编码到 Spring 的 application.properties 中。

来自this article我看到您可以使用预定义的主机名启动 mongodb 容器。 据我了解,定义到 compose yml 文件中的所有服务都在同一网络中,但它们具有不同的 ip,对吗? 所以主要问题是如何在 docker-compose.yml 中定义 mongodb 主机名,并在 Spring Boot application.properties 文件中使用该名称。

我会尽力提供尽可能多的信息,但如果有不清楚的地方请告诉我。

以下是有关 Spring Boot 应用程序的一些信息。

我在 spring 项目中使用的依赖项是:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

该应用程序具有扩展 MongoRepository 的接口(interface):

import org.springframework.data.mongodb.repository.MongoRepository;

public interface ServiceLoggerRepository extends MongoRepository<ExampleEntity, String> {
}

它使用@Document注释实体

import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "example")
public class ExampleEntity {

    @Id
    private String _id;
    private String name;
}

数据库连接定义在application.properties文件中:

#here is the problem - this the vm ip
spring.data.mongodb.uri=mongodb://192.168.0.51 
spring.data.mongodb.database=mongo-test

有关 Spring Boot 的 Dockerfile 的信息:

FROM openjdk:8-jre
COPY ./mongo-test.jar ./usr/mongo-test.jar
EXPOSE 8080
RUN sh -c 'touch /usr/mongo-test.jar'
ENTRYPOINT ["java","-jar","/usr/mongo-test.jar"]

有关 docker-compose 的信息: 它有 2 个服务 - MongoDB 和 Spring Boot 应用程序。

version: "3"
services:
  mongodb:
    restart: always
    image: mongo
    container_name: "mongodb-test"
    ports:
    - 27017:27017
    command: --smallfiles
  mongo-logger:
    restart: always
    build: ./mongo-test
    container_name: "mongo-test"
    ports:
    - 8080:8080
    depends_on:
    - mongodb
    links:
    - mongodb

当容器创建并运行时,它就可以工作了。但问题是我不知道在哪里以及如何定义 spring.data.mongodb.uri 来使用诸如 spring.data.mongodb.uri=mongodb://mongo-hostname 之类的静态内容。

这是否可能,是否有任何重要的解决方案或良好实践?

最佳答案

要访问 mongodb,您需要使用 docker-compose.yml 中定义的 mongodb 服务名称。

您可以使用环境变量在应用程序属性中进行设置,如下所示:

//aplication.properties
...
spring.data.mongodb.uri=${MONGODB_URI}

//docker-compose.yml
version: "3"
services:
  mongodb:
    image: mongo
    container_name: "mongodb-test"
    ports:
    - 27017:27017
  mongo-logger:
    build: ./mongo-test
    container_name: "mongo-test"
    ports:
    - 8080:8080
    environment:
    - MONGODB_URI=mongodb://mongodb
    depends_on:
    - mongodb

关于java - 如何为 MongoDB 和 Spring Boot 将主机名定义到 docker-compose.yml 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56128635/

相关文章:

java - 从 Java 发送 JSON 对象并在 PHP 中解码 JSON 对象

java - 如何在发送之前从 Java Request 对象获取 XML 文件。网络服务 SOAP

node.js - 如何最好地通过 meteor 来 'tail -f' mongo 中的大型集合?

java - @ComponentScan 与 Spring 和 Mongodb

java - Ajax 调用 Spring Boot Controller 来重定向 View

java - 范围字符串和 NSMakeRange : from Objective-C to Java

java - 将数据从 JSP 动态地从 HTML 页面传递到 Servlet

javascript - 我可以在 mongoDB 中根据填充条件查找文档吗?

mongodb - 是否可以在数组键上查询 mongodb?

java - H2 org.h2.jdbc.JdbcSQLException 与正确的 DDL sql : error code = [42000-196]