使用Docker时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

我正在使用Jhipster构建一个应用程序。 我的示例应用程序-prod.yml如下所示,由Jhipster提供

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顺序,该顺序旨在允许合理地重写值。按以下顺序考虑属性:

  • 主目录上的Devtools全局设置属性(~/.spring-boot-Devtools.properties,当Devtools处于活动状态时)
  • @TestPropertySource对您的测试进行注释
  • @SpringBootTest#测试上的属性注释属性
  • 命令行参数
  • SPRING_应用程序_JSON的属性(嵌入在环境变量或系统属性中的内联JSON)
  • ServletConfig初始化参数
  • ServletContext初始化参数
  • 来自java的JNDI属性:comp/env
  • Java系统属性(System.getProperties()
  • 操作系统环境变量
  • 仅在random.*中具有属性的RandomValuePropertySource
  • 打包jar之外的特定于概要文件的应用程序属性(应用程序-{Profile}.properties和YAML变体)
  • jar中打包的特定于概要文件的应用程序属性(应用程序-{Profile}.properties和YAML变体)
  • 打包jar之外的应用程序属性(Application.properties和YAML变体)
  • 打包在jar中的应用程序属性(Application.properties和YAML变体)
  • @@Configuration类上的PropertySource注释
  • 默认属性(使用SpringApplication.setDefaultProperties指定)
  • 您在这里发布的mysql docker的yml文件中的条目是RDMS mysql数据库的根用户的凭证,该数据库作为docker服务启动。这并不意味着您的应用程序将使用这些凭据。您可能在application-prod.yml文件中也有相同的凭证,该文件已在打包阶段添加到war中,然后将此war放入docker中

    在用于启动docker compose的app.yml文件中,您还应该具有一些环境变量,例如

    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位置进行检查。