尝试手动启动了两个 docker containter:
- 一个用于 rasa core
- 一个用于 rasa actions
但是,发现测试对话不涉及 actions 服务的,一切正常返回; 但是跟 actions 相关的,没有任何返回。
查看 docker 容器日志
docker logs -f <containter-id>
这样就能实时查看 docker 容器中 rasa 的运行日志,跟 tail -f 效果等同。非常方便。
异常日志
查看了一下 rasa core 的日志:
rasa.shared.exceptions.RasaException: Failed to execute custom action 'action_weekday'. Couldn't connect to the server at 'http://localhost:5055/webhook.
看来无法连接上 actions 服务。
确认 actions 服务是否正常
但是在宿主系统里请求 actions 服务,实际上是可以建立连接的。
$ curl http://localhost:5055/webhook
{"error":"Method GET not allowed for URL \/webhook","request_body":null}
说明问题出在两个 docker 容器的网络连接上。即 rasa core 无法连接 rasa actions 服务。
解决方法
在 github 上找到了一个相同的问题:
https://github.com/RasaHQ/rasa/issues/3290
简单来说,使用 docker compose 是最快捷的方案,在一个 compose 文件中多个 service 默认位于 同一个网络中。而如果是手动通过命令来启动这两个容器则默认并不是在同一个网络中,相互之间无法访问。
I had the same issue. You can fix it by using
action_endpoint:
url: 'http://action_server:5055/webhook'
in your endpoint.yml
The docker containers talk with their service name to each other, not over localhost. (see your nlu endpoint ;) )
新建一个 docker-compose.yml:
version: '3.0'
services:
rasa_core:
image: rasa/rasa:3.4.6-full
ports:
- 9020:5005
volumes:
- ./:/app
command:
- run
- --enable-api
action_server:
image: rasa/rasa:3.4.6-full
ports:
- 5055:5055
volumes:
- ./:/app
command:
- run
- actions
同时修改 action_endpoint 中的 localhost 为 action service 名:
action_endpoint:
- url: "http://localhost:5055/webhook"
+ url: "http://action_server:5055/webhook"
如果没有 docker 基础,推荐先阅读:
对话机器人 rasa (四):生产环境部署,Ubuntu 服务器基于 docker
启动
$ docker compose up
[+] Running 3/3
✔ Network py_rasa_default Created
✔ Container py_rasa-action_server-1 Created
✔ Container py_rasa-rasa_core-1 Created
Attaching to py_rasa-action_server-1, py_rasa-rasa_core-1
这里会看到:
- 自动创建了一个网络,两个 service 均处于此网络中
- 如果没有指定容器的名子,此时也自动创建了容器名称,通过 docker container ls 就能看到
此时测试,就能看到与 actions 相关的消息能正常回复了。
这种启动方式默认是前台运行,能看到所有的日志输出。 但终端关闭,容器也会退出。
后台启动
$ docker compose up -d
[+] Running 2/2
✔ Container py_rasa-action_server-1 Started
✔ Container py_rasa-rasa_core-1 Started
然后查询一下服务运行状态:
docker stats --all
总结
docker-compose.yml 文件来管理 docker 配置,真是方便:
- 一键启动多个服务
- 配置放到 git 管理中,不会遗忘
怪不得现在开源项目都默认带一个 docker-compose.yml 文件,配置开发环境省心多了。
查看合集
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式