使用Docker时Jhipster应用程序中的数据库连接
我正在使用Jhipster构建一个应用程序。 我的示例应用程序-prod.yml如下所示,由Jhipster提供使用Docker时Jhipster应用程序中的数据库连接,jhipster,Jhipster,我正在使用Jhipster构建一个应用程序。 我的示例应用程序-prod.yml如下所示,由Jhipster提供 spring: datasource: type: com.zaxxer.hikari.HikariDataSource url: jdbc:mysql://localhost:3306/MyModule?useUnicode=true&characterEncoding=utf8&useSSL=false na
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://localhost:3306/MyModule?useUnicode=true&characterEncoding=utf8&useSSL=false
name:
username: hello
password: hello
hikari:
data-source-properties:
...
jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
database: MYSQL
show-sql: false
org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
...
当我在没有docker的情况下运行应用程序时,如果用户名/密码不正确,我会得到一个mysql错误,这是正常的
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
但是,如果我使用docker image运行同一个应用程序,并在docker compose文件中提供db属性,则application-prod.yml文件中的属性似乎会被忽略。也就是说,即使应用程序属性文件中的数据库属性不正确,但docker compose文件中提供了正确的值,应用程序在使用docker image运行时似乎工作正常,并且可以连接到数据库
docker文件中的条目如下所示
version: '2'
services:
mymodule-mysql:
container_name: mymodule-mysql
image: mysql:5.7.13
environment:
- MYSQL_USER=root
- MYSQL_ROOT_PASSWORD=root
- MYSQL_ALLOW_EMPTY_PASSWORD=no
- MYSQL_DATABASE=mymodule
ports:
- 3306:3306
command: mysqld --lower_case_table_names=1 --skip-ssl
docker compose文件中的环境变量似乎覆盖了属性application-dev.yml文件。我的想法正确吗
如果有人能在jhipster中详细解释这是如何工作的,那就好了 您的观察是正确的:在环境变量上指定的值覆盖了jar中yml文件中指定的值此行为与JHipster无关这是纯弹簧靴。下面简要介绍了如何覆盖属性的顺序() Spring Boot使用一个非常特殊的PropertySource顺序,该顺序旨在允许合理地重写值。按以下顺序考虑属性:
environment:
- SPRING_PROFILES_ACTIVE=prod
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/myDataBase?useUnicode=true&characterEncoding=utf8&useSSL=false
- JHIPSTER_SLEEP=10 # gives time for the database to boot before the application
用于覆盖application-prod.yml文件的spring。同样重要的是,您的应用程序容器知道mysql容器。如果我理解正确,1)app.yml的环境变量中的条目将覆盖application-prod.yml属性。因此,application-prod.yml中的用户名和密码未被使用。2) mysql.yml文件中的凭据用于启动docker服务并提供根用户凭据。那么,应用程序是否使用默认的根凭据连接到数据库?但是如果我希望我的应用程序在何处使用不同的凭据集(而不是根凭据),我应该提到它。我不能在application-prod.yml中提到它,因为mysql属性正在被覆盖。在我的例子中,docker映像似乎启动了,即使application-prod.yml中提供了错误的用户名/密码,这表明可能使用了mysql.yml的根凭据。是吗?1)正确2)正确我认为您的应用程序没有使用默认的根凭据。您的应用程序可能正在开发模式下运行,并且它使用内存中的h2数据库?您可以在application-prod.yml中添加凭据。只有在指定了环境变量上的凭据(即不强制指定)时,才会忽略这些凭据。如果查看文档或我的答案,您可以看到在查找凭据时,环境变量的设置位于10位置。另一方面,jar文件中application-prod.yml中的变量稍后将在15位置进行检查。