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

时间:2019-05-14 10:43:42

标签: 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的接口:

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之类的静态内容。

有可能这样做吗?有没有解决方法或好的做法?

1 个答案:

答案 0 :(得分:3)

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