【问题标题】:Database Connection in Jhipster Application while using Docker使用 Docker 时 Jhipster 应用程序中的数据库连接
【发布时间】:2016-11-27 01:22:12
【问题描述】:

我正在使用 Jhipster 构建一个应用程序。 我的示例 application-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 映像运行相同的应用程序并在 docker compose 文件中提供 db 属性,则 application-prod.yml 文件中的属性似乎会被忽略。也就是说,即使应用程序属性文件中的数据库属性不正确,但 docker compose 文件中提供了正确的值,应用程序在使用 docker 映像运行时似乎可以正常工作并且可以连接到数据库。

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 中的工作原理,那就太好了。

【问题讨论】:

    标签: jhipster


    【解决方案1】:

    您的观察是正确的:通过环境变量指定的值将覆盖 jar 中 yml 文件中指定的值。 此行为与 JHipster 无关这是纯弹簧靴。以下是属性被覆盖顺序的简短概述 (from the spring doc)

    Spring Boot 使用一个非常特殊的 PropertySource 顺序,旨在允许明智地覆盖值。属性按以下顺序考虑:

    1. 您的主目录上的 Devtools 全局设置属性(当 devtools 处于活动状态时为 ~/.spring-boot-devtools.properties)。
    2. 您的测试中的@TestPropertySource 注释。
    3. 您的测试中的@SpringBootTest#properties 注释属性。
    4. 命令行参数。
    5. 来自 SPRING_APPLICATION_JSON 的属性(嵌入在环境变量或系统属性中的内联 JSON)
    6. ServletConfig 初始化参数。
    7. ServletContext 初始化参数。
    8. 来自 java:comp/env 的 JNDI 属性。
    9. Java 系统属性 (System.getProperties())。
    10. 操作系统环境变量。
    11. 仅具有随机属性的 RandomValuePropertySource。*。
    12. 打包 jar 之外的特定于配置文件的应用程序属性(application-{profile}.properties 和 YAML 变体)
    13. 打包在您的 jar 中的特定于配置文件的应用程序属性(application-{profile}.properties 和 YAML 变体)
    14. 打包 jar 之外的应用程序属性(application.properties 和 YAML 变体)。
    15. 应用程序属性打包在您的 jar 中(application.properties 和 YAML 变体)。
    16. @Configuration 类上的@PropertySource 注释。
    17. 默认属性(使用 SpringApplication.setDefaultProperties 指定)。

    您在此处发布的 mysql docker 的 yml 文件中的条目是作为 docker 服务启动的 RDMS mysql 数据库的 root 用户的凭据。这并不意味着您的应用程序将使用这些凭据。可能您在 application-prod.yml 文件中也具有相同的凭据,该文件已在打包阶段添加到您的战争中,然后将该战争放入您的 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 服务并提供 root 用户凭据。那么应用程序是否使用默认的根证书来连接数据库?
    • 但是,如果我希望我的应用程序使用不同的凭据集(root 除外),我应该在哪里以及应该提及它。我不能在 application-prod.yml 中提及它,因为 mysql 属性正在被覆盖。在我的情况下,即使在 application-prod.yml 中提供了错误的用户名/密码,docker 映像似乎也已启动,这表明可能使用了 mysql.yml 的根凭据。是这样吗?
    • 1) 正确 2) 正确 我认为您的应用程序没有使用默认的根凭据。可能是您的应用程序在开发模式下运行并且它使用内存中的 h2 数据库?
    • 您可以在 application-prod.yml 中添加您的凭证。仅当指定了环境变量上的凭据时,这些才被忽略,即不是必须指定的。如果您查看文档或我的答案,您会发现在查找凭据时,环境变量的设置位于第 10 位。另一方面,您的 jar 文件中 application-prod.yml 中的变量稍后会在第 15 位进行检查。
    猜你喜欢
    • 2020-12-21
    • 2016-04-23
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    相关资源
    最近更新 更多