我正在尝试在Heroku上部署我的Quarkus-app。它工作正常,但我需要使用固定值指定数据源参数。因为Heroku可能会旋转此参数,所以这不是一个真正的好主意。
在Quarkus中,我需要应用程序中的这3个参数。属性:
quarkus.datasource.username
quarkus.datasource.password
quarkus.datasource.jdbc.url
Heroku只给了我1个环境变量(DATABASE\u URL),它以以下方式定义连接字符串:
postgres://user:pass@服务器:端口/数据库名称
我知道我可以使用这样的环境变量:
quarkus。数据源。jdbc。url=jdbc:${DATABASE\u url}
但我需要拆分变量以提取用户和密码并更改前缀(postgresql而不是postgres)。
有人知道如何做到这一点吗?
我创建了一个bash脚本,从Heroku数据库URL提取三个Quarkus参数。
它适用于JVM和Native版本。
我的application.properties代码:
quarkus.datasource.jdbc.url=${DB_JDBC_URL:jdbc-url}
quarkus.datasource.username=${DB_JDBC_USER:postgres}
quarkus.datasource.password=${DB_JDBC_PASSWORD:postgres}
# cut the DATABASE_URL after '@'
export DB_JDBC_URL=jdbc:postgresql://${DATABASE_URL#*@}
# substring the DATABASE_URL between '//' and ':'
export DB_JDBC_USER=$(expr $DATABASE_URL : '.*/\([^:]*\):.*')
# substring the DATABASE_URL between ':' and '@'
export DB_JDBC_PASSWORD=$(expr $DATABASE_URL : '.*:\([^@]*\)@.*')
用heroku保存以下脚本。项目根文件夹中的sh文件名。
#!/bin/sh
# =============================================================================
# This script automatically splits the Heroku ENV DATABASE_URL variable
# into the three JDBC variables needed from Quarkus.
#
# It will only do the split if the DB_HEROKU_SPLIT is set to "true".
#
# If you set DB_HEROKU_SPLIT to 'false', you must pass the Quarkus parameters:
# - DB_JDBC_URL;
# - DB_JDBC_USER;
# - DB_JDBC_PASSWORD.
#
# For test purposes, you can set the DB_ECHO_VALUES to 'true' and check if the
# values are correct.
#
# Pattern of DATABASE_URL from Heroku:
# --------------------------------------
# postgres://username:password@host:port/databasename
#
# Pattern of JDBC variables of Quarkus:
# -------------------------------------
# quarkus.datasource.jdbc.url=jdbc:postgresql://host:port/databasename
# quarkus.datasource.username=username
# quarkus.datasource.password=password
#
# =============================================================================
echo DB_HEROKU_SPLIT=[$DB_HEROKU_SPLIT]
# check for 'true' in string (case insensitive)
if [[ "${DB_HEROKU_SPLIT,,}" == "true" ]]; then
# cut the DATABASE_URL after '@'
export DB_JDBC_URL=jdbc:postgresql://${DATABASE_URL#*@}
# substring the DATABASE_URL between '//' and ':'
export DB_JDBC_USER=$(expr $DATABASE_URL : '.*/\([^:]*\):.*')
# substring the DATABASE_URL between ':' and '@'
export DB_JDBC_PASSWORD=$(expr $DATABASE_URL : '.*:\([^@]*\)@.*')
fi
# check for 'true' in string (case insensitive)
if [[ "${DB_ECHO_VALUES,,}" == "true" ]]; then
echo DATABASE_URL=[$DATABASE_URL]
echo DB_JDBC_URL=[$DB_JDBC_URL]
echo DB_JDBC_USER=[$DB_JDBC_USER]
echo DB_JDBC_PASSWORD=[$DB_JDBC_PASSWORD]
fi
请记住将此文件包含到您的中。dockerignore公司:
*
!heroku.sh
!target/*-runner
!target/*-runner.jar
!target/lib/*
!target/quarkus-app/*
将原始
ENTRYPOINT
替换为:
# commands from original Quarkus Dockerfile.jvm file suppressed for breviety
COPY --chown=1001 heroku.sh /deployments/heroku.sh
RUN chmod 540 /deployments/heroku.sh
CMD [ "/bin/bash", "-c" , ". /deployments/heroku.sh && /deployments/run-java.sh" ]
将原始
CMD
替换为:
# commands from original Quarkus Dockerfile.jvm file suppressed for breviety
COPY --chown=1001 heroku.sh /work/heroku.sh
RUN chmod 540 /work/heroku.sh
CMD ["/bin/bash", "-c", ". ./heroku.sh && ./application", "-Dquarkus.http.host=0.0.0.0"]
DB_HEROKU_SPLIT
将
DB_HEROKU_SPLIT
添加到Heroku的Config Vars中,并将其设置为true
,如果您希望bash脚本为您提取Quarkus数据源变量。
将其设置为false,您可以在Heroku配置变量中创建Quarkus数据源(DB\u JDBC\u URL、DB\u JDBC\u密码和DB\u JDBC\u密码),并绕过bash脚本将其直接传递给Quarkus。
DB\u ECHO\u值
我还创建了一个DB\u ECHO\u VALUES变量,允许您在日志上显示数据源。如果要在屏幕上打印日志,只需将DB\u ECHO\u VALUES设置为true即可。
您可以针对您的用例使用JDBC\u DATABASE\u URL、JDBC\u DATABASE\u用户名和JDBC\u DATABASE\u密码环境变量。
有关更多详细信息,您可以在此处找到文档:https://devcenter.heroku.com/articles/connecting-to-relational-databases-on-heroku-with-java#using--jdbc\u database\u url
我想用Optaplanner解决VRP问题(添加一些内容)。在文档中,人们经常说,预先计算位置之间的距离,然后对每个位置使用
我目前正在开发一个尽可能尊重六边形架构原则的应用程序。 因此,我的“域”模块(组Id: ; 工件Id:)不依赖于任何技术框架。 我的所有服务都使用自定义注释(本身是我域的一部分)进行注释: 然而,在我的“Quarkus应用”模块(groupId:< code > acme ;artifact id:< code > app-quar kus ,我需要注入我的“域”模块中定义的服务(< code>a
问题内容: 我已经使用Angular 2 CLI构建了Angular 2项目,并能够使用本教程将应用程序部署到Heroku 。 现在,我想为应用程序的不同环境(开发,登台,生产等)创建管道。 在我的package.json中,它将创建我的代码的生产版本,我的应用程序将在此版本上运行。有没有一种方法可以根据我在Heroku设置中的设置进行更改?例如,它将针对开发环境或登台环境。还是我需要以其他方式设
我用Node.js设置了Socket.io,它通过侦听/连接到端口8000(或另一个不是服务器运行端口的端口)在本地开发机器上工作。 当我试图在heroku上做同样的事情时,客户端脚本导入失败了。 我尝试过相对路径 编辑:我实际上是在使用geddy mvc框架,我想让它在heroku上如何设置(基本上就像socket.io一样),我发现这个答案让我看起来可以类似地使用它:GeddyJS&socke
使现代化 在解决了一些与主要问题无关的问题后,我修复了示例代码中的小错误,主要问题仍然是关于服务之间的非阻塞流。 背景信息: 我正在Quarkus下移植一个Spring WebFlux服务。该服务在多个庞大的数据集上运行长时间搜索,并在Flux(文本/事件流)可用时返回部分结果。 问题: 现在,我正在尝试使用叛变多与垂直。Quarkus下的x,但无法确定消费者服务如何在不阻塞的情况下接收此流。 在