背景故事
通过一点谷歌搜索,我推测部署到 prod 而无需每次手动更改 conf 文件的最佳方法是维护单独的 conf 文件并覆盖 procfile 中的 conf-file-to-use
我的方法
我创建了两个conf文件
application.conf -- http://pastebin.com/BaaBuRHR
产品配置文件
include "application.conf"
http.port=${PORT}
applyEvolutions.default=true
db.default.driver=org.postgresql.Driver
db.default.url=${DATABASE_URL}
db.default.user=xxxxxxxxxxx
db.default.password=xxxxxxxxxxxxxxxxxxxxxxx
我的 Procfile 看起来像这样
web: target/start ${JAVA_OPTS} -Dconfig.file=/opt/conf/prod.conf
当我部署时,我的日志说
Feb 03 06:34:09 psytools heroku/web.1: Starting process with command `target/start ${JAVA_OPTS} -Dconfig.file=/conf/prod.conf`
Feb 03 06:34:10 psytools app/web.1: Play server process ID is 2
Feb 03 06:34:11 psytools app/web.1: [[37minfo[0m] application - Application has started
Feb 03 06:34:11 psytools app/web.1: [[37minfo[0m] play - Application started (Prod)
Feb 03 06:34:11 psytools app/web.1: [[37minfo[0m] play - Listening for HTTP on port 9000...
Feb 03 06:34:11 psytools heroku/web.1: Error R11 (Bad bind) -> Process bound to port 9000, should be 39098 (see environment variable PORT)
显然,heroku 正在尝试使用默认端口 9000,而不是使用 PORT 环境。
我的问题是:
- 这是维护生产/开发环境的正确方法吗
- 为什么端口未从 PORT env 变量中读取
- 以前,当我刚开始
Play
:D,
我的 application.conf 有这条线
db.default.url="jdbc:postgresql://ec2-54#####l0k8?ssl=true&sslfactory=org.postgresql.#ssl.NonValidatingFactory"
我的proc文件是
web: target/start xxxxxx xxxxxxx xxxxxxx xxxxx -Ddb.default.url=${DATABASE_URL}
DATABASE_URL 实际上只是其中的postgresql://ec2-54#####l0k8
一部分。但这仍然有效,这意味着heroku使用了来自conf而不是proc文件的数据库url。这是否意味着proc文件覆盖不起作用?