对话机器人 Rasa(九): docker compose 同时部署 rasa core 和 actions 服务

文章目录

    尝试手动启动了两个 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 文件,配置开发环境省心多了。

    查看合集

    📖 对话机器人 Rasa 中文系列教程

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式