我想知道如何解决问题:我在docker上有一个spring-boot应用程序,该应用程序连接到db和其他服务。 可能有些客户端在其他URL上将拥有数据库,而不是其他URL。
我使用spring.datasource.url
属性连接到数据库。我应该将其添加到args并使用:
Properties properties = new Properties();
properties.put("spring.datasource.url", args[1]);
application.setDefaultProperties(properties);
这样的东西会覆盖它吗?但是每次运行都需要添加数据库URL。还是使用其他东西?
答案 0 :(得分:1)
数据源可以从docker-compose文件中作为变量读取:
假设这是您的docker-compose文件:
version: '2'
services:
db:
image: customimage_mysql
restart: always
ports:
- "3306:3306"
application:
build: .
ports:
- "9111:9111"
depends_on:
- db
links:
- db
environment:
- database.url=jdbc:mysql://mysql-docker-container:3306/spring_app_db?
现在您有2个选择:
- 为docker内部的databse.url设置不同的值,以分别为每个应用程序构建图像和构建图像
- 在docker-compose文件中设置不同的变量(databse1.url,databse2.url,databse3.url等),并从中引用它们 application.properties:
application.properties
spring.datasource.url=${database.url}
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=true
spring.jpa.show-sql=true
server.port=9111
答案 1 :(得分:0)
根据您在此处提供的信息,数据库链接应该是您的应用程序的配置。基本上,您需要一个配置文件
application.properties
当您要更改URL时,只需在配置文件中进行更改并构建即可。
您可以找到文档here
此外,如果您使用的是诸如kubernetes之类的devops环境,则必须拥有一个config-map,并且您的部署将从这些config-map中获取配置,例如application.properties文件。
答案 2 :(得分:0)
如果您有很多部署,每个部署都有自己的数据库,那么这将需要某种管理方式。但是,您不希望它需要大量的应用程序构建-您想要外部化该配置。
排序启动具有用于外部化配置(https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html)的功能。对于您而言,最简单的方法是使用环境名称,这些环境变量通过宽松的名称绑定(https://github.com/spring-projects/spring-boot/wiki/Relaxed-Binding-2.0)覆盖属性。如果应用程序使用名为SPRING_DATASOURCE_URL的环境变量启动,则此值将覆盖spring.datasource.url属性中的值。您的属性文件有效地设置了可以覆盖的默认值。这对于Spring Boot来说是开箱即用的行为,并且也适用于其他属性(包括所有db属性,尽管如果您拥有不同类型的数据库,则需要在构建中包括所有相关的驱动程序jar)。
由于使用的是docker,因此可以在部署/启动时使用-e参数在容器中设置环境变量。因此,您可以在部署时为每个已部署的实例覆盖。
您可能会在Docker之上使用其他层,例如docker-compose或Kubernetes。然后,您可能需要在描述您的部署配置的部署描述符文件中设置环境变量。但是该配置管理问题位于不同的层/阶段,并且一旦外部化了配置,就不再是构建步骤的一部分。