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

Posted

技术标签:

【中文标题】如何为 MongoDB 和 Spring Boot 定义主机名到 docker-compose.yml【英文标题】:How to define hostname into docker-compose.yml for MongoDB and Spring Boot 【发布时间】:2019-10-01 09:00:46 【问题描述】:

我正在尝试使用 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 的接口:

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 这样的静态对象。

是否有可能,是否有任何解决方案或良好做法可以做到这一点?

【问题讨论】:

检查this 【参考方案1】:

要访问 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

【讨论】:

谢谢。正是我需要的:)

以上是关于如何为 MongoDB 和 Spring Boot 定义主机名到 docker-compose.yml的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 如何为 Hikari Pool 和 jdbcTemplate 设置连接获取大小

如何为具有 Spring Security 配置的 Spring Boot API 编写单元测试

如何为 Webflux、Spring-Security、okta-spring-boot-starter 和 Okta-React 正确使用 CORS?

如何为 Spring Data 中的类配置 MongoDb 集合名称

如何为JSP配置spring boot mvc app?

如何为 ZuulException 自定义 Spring Boot 控制器 API 响应