我正在尝试使用 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/