我一直在尝试使用推荐的构建包在Heroku上安装Webmachine应用程序。我的Procfile是
# Procfile
web: sh ./rel/app_name/bin/app_name console
不幸的是,这并没有正确启动dyno,它在中失败了
2015-12-08T16:34:55.349362+00:00 heroku[web.1]: Starting process with command `sh ./rel/app_name/bin/app_name console`
2015-12-08T16:34:57.387620+00:00 app[web.1]: Exec: /app/rel/app_name/erts-7.0/bin/erlexec -boot /app/rel/app_name/releases/1/app_name -mode embedded -config /app/rel/app_name/releases/1/sys.config -args_file /app/rel/app_name/releases/1/vm.args -- console
2015-12-08T16:34:57.387630+00:00 app[web.1]: Root: /app/rel/app_name
2015-12-08T16:35:05.396922+00:00 app[web.1]: 16:35:05.396 [info] Application app_name started on node 'app_name@127.0.0.1'
2015-12-08T16:35:05.388846+00:00 app[web.1]: 16:35:05.387 [info] Application lager started on node 'app_name@127.0.0.1'
2015-12-08T16:35:05.399281+00:00 app[web.1]: Eshell V7.0 (abort with ^G)
2015-12-08T16:35:05.399283+00:00 app[web.1]: (app_name@127.0.0.1)1> *** Terminating erlang ('app_name@127.0.0.1')
2015-12-08T16:35:06.448742+00:00 heroku[web.1]: Process exited with status 0
2015-12-08T16:35:06.441993+00:00 heroku[web.1]: State changed from starting to crashed
但当我通过heroku工具带运行相同的命令时,它会从控制台启动。
$ heroku run "./rel/app_name/bin/app_name console"
Running ./rel/app_name/bin/app_name console on tp-api... up, run.4201
Exec: /app/rel/app_name/erts-7.0/bin/erlexec -boot /app/rel/app_name/releases/1/app_name -mode embedded -config /app/rel/app_name/releases/1/sys.config -args_file /app/rel/app_name/releases/1/vm.args -- console
Root: /app/rel/app_name
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
16:38:43.194 [info] Application lager started on node 'app_name@127.0.0.1'
16:38:43.196 [info] Application app_name started on node 'app_name@127.0.0.1'
Eshell V7.0 (abort with ^G)
(app_name@127.0.0.1)1>
有没有办法启动节点,也许作为dyno上的守护进程?
注意我曾尝试使用start
而不是console
,但没有取得任何成功。
因此,经过大量的修补、尝试和错误,找出了问题所在。Heroku不喜欢有交互式shell,因此通过console
启动Erlang应用程序时崩溃。
我已经将我的Procfile调整为以下内容:
# Procfile
web: erl -pa $PWD/ebin $PWD/deps/*/ebin -noshell -boot start_sasl -s reloader -s app_name -config ./rel/app_name/releases/1/sys
它使用发行版的sys.config
配置文件启动应用程序app_name
。这里的关键是在命令中有-noshell
选项,允许heroku按预期运行进程。