几天来,我一直在尝试在 Heroku 上部署机器人,但一直没有成功。我的机器人有一个托管在另一个应用程序上的动作服务器。主机器人包含一个 Dockerfile,内容如下:
# from rasa base image
FROM rasa/rasa:2.8.2-full
# copy all source and the Rasa generated model
COPY . /app
# inform which port will run on
EXPOSE 5005
# script to run rasa core
COPY startup.sh /app/scripts/startup.sh
# script to run rasa shell
COPY shell.sh /app/scripts/shell.sh
USER root
RUN chmod a+x /app/scripts/startup.sh
RUN chmod a+x /app/scripts/shell.sh
WORKDIR /app
ENTRYPOINT []
ENV shell_mode false
# launch script (rasa shell or rasa run)
CMD sh -c 'if [ "$shell_mode" = false ]; then /app/scripts/startup.sh; else /app/scripts/shell.sh; fi'
将此容器推送到 Heroku 后,我不断收到以下日志:
2021-08-08T05:05:19.003044+00:00 heroku[web.1]: Starting process with command `/bin/bash -o pipefail -c sh\ -c\ \'if\ \[\ \"\false\"\ \=\ false\ \]\;\ then\ /app/scripts/startup.sh\;\ else\ \ /app/scripts/shell.sh\;\ fi\'`
2021-08-08T05:05:22.624829+00:00 app[web.1]: PORT 56161
2021-08-08T05:05:28.172219+00:00 app[web.1]: 2021-08-08 05:05:28 INFO root - Starting Rasa server on http://localhost:56161
2021-08-08T05:05:28.198725+00:00 app[web.1]: 2021-08-08 05:05:28 INFO rasa.model - Loading model models/20210807-142446.tar.gz...
2021-08-08T05:06:19.182952+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2021-08-08T05:06:19.237369+00:00 heroku[web.1]: Stopping process with SIGKILL
2021-08-08T05:06:19.401953+00:00 heroku[web.1]: Process exited with status 137
2021-08-08T05:06:19.707060+00:00 heroku[web.1]: State changed from starting to crashed
我的startup.sh
包含:
echo PORT $PORT
rasa run -m models --endpoints heroku-endpoints.yml --cors "*" --enable-api -p $PORT
我做错了什么?请帮忙。
答案1
我在部署 python slackbot 时遇到了同样的问题。我使用的是 gunicorn,问题似乎是 gunicorn 没有及时将自己绑定到 heroku 提供的端口。这个问题通过--bind :$PORT
向 Procfile 添加选项来解决,如前所述这里
确保 gunicorn 绑定成功的日志是这样的
2021-09-06T17:43:34.126351+00:00 app[web.1]: [2021-09-06 17:43:34 +0000] [4] [INFO] Starting gunicorn 20.1.0
2021-09-06T17:43:34.127129+00:00 app[web.1]: [2021-09-06 17:43:34 +0000] [4] [INFO] Listening at: http://0.0.0.0:47022 (4)
我知道这没有直接关系,但希望这对你有帮助!
您可以尝试的另一件事是从脚本发出传出请求,这暂时解决了我的问题,因为它强制应用程序使用端口发送一些出站流量。您可能会发现应用程序的启动时间太长,无法及时将自身绑定到端口