如何为 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?