Running Rasa with Docker
Running Rasa with Docker
This is a guide on how to build a Rasa assistant with Docker. If you haven’t used Rasa before, we’d recommend that you start with the Rasa Tutorial.
Installing Docker
If you’re not sure if you have Docker installed, you can check by running:
docker -v && docker-compose -v
# Docker version 18.09.2, build 6247962
# docker-compose version 1.23.2, build 1110ad01
If Docker is installed on your machine, the output should show you your installed versions of Docker and Docker Compose. If the command doesn’t work, you’ll have to install Docker. See Docker Installation for details.
Building an Assistant with Rasa and Docker
This section will cover the following:
Setting up your Rasa project and training an initial model
Talking to your AI assistant via Docker
Choosing a Docker image tag
Training your Rasa models using Docker
Talking to your assistant using Docker
Running a Rasa server with Docker
Setup
Just like in the tutorial, you’ll use the rasa init command to create a project.
The only difference is that you’ll be running Rasa inside a Docker container, using the image rasa/rasa. To initialize your project, run:
docker run -v $(pwd):/app rasa/rasa init --no-prompt
What does this command mean?
-v $(pwd):/appmounts your current working directory to the working directory in the Docker container. This means that files you create on your computer will be visible inside the container, and files created in the container will get synced back to your computer.rasa/rasais the name of the docker image to run.- the Docker image has the
rasacommand as its entrypoint, which means you don’t have to typerasa init, justinitis enough.
Running this command will produce a lot of output. What happens is:
- a Rasa project is created
- an initial model is trained using the project’s training data.
Note
By default Docker runs containers as root user. Hence, all files created by these containers will be owned by root. See the documentation of docker and docker-compose if you want to run the containers with a different user.
Talking to Your Assistant
To talk to your newly-trained assistant, run this command:
docker run -it -v $(pwd):/app rasa/rasa shell
This will start a shell where you can chat to your assistant. Note that this command includes the flags -it, which means that you are running Docker interactively, and you are able to give input via the command line.
Customizing your Model
Choosing a Tag
To keep images as small as possible, we publish different tags of the rasa/rasa image with different dependencies installed. See Choosing a Pipeline for more information about dependencies.
The tags are:
{version}{version}-spacy-en{version}-spacy-de{version}-mitie-en{version}-full
Training a Custom Rasa Model with Docker
Edit the config.yml file to use the pipeline you want, and place your NLU and Core data into the data/ directory. Now you can train your Rasa model by running:
docker run \
-v $(pwd):/app \
rasa/rasa:latest-full \
train \
--domain domain.yml \
--data data \
--out models
Here’s what’s happening in that command:
-v $(pwd):/app: Mounts your project directory into the Docker container so that Rasa can train a model on your training datarasa/rasa:latest-full: Use the Rasa image with the taglatest-fulltrain: Execute therasa traincommand within the container.
Note
If you are using a custom NLU component or policy, you have to add the module file to your Docker container. You can do this by either mounting the file or by including it in your own custom image (e.g., if the custom component or policy has extra dependencies). Make sure that your module is in the Python module search path by setting the environment variable PYTHONPATH=$PYTHONPATH:<directory of your module>.
Running the Rasa Server
To run your AI assistant in production, configure your required Messaging and Voice Channels in credentials.yml. If this file does not exist, create it using:
touch credentials.yml
Then edit it according to your connected channels. After, run the trained model with:
docker run \
-v $(pwd)/models:/app/models \
rasa/rasa:latest-full \
run
Using Docker Compose to Run Multiple Services
To run Rasa together with other services, such as a server for custom actions, it is recommended to use Docker Compose.
Start by creating a file called docker-compose.yml:
touch docker-compose.yml
Add the following content to the file:
version: '3.0'
services:
rasa:
image: rasa/rasa:latest-full
ports:
- 5005:5005
volumes:
- ./:/app
command:
- run
Adding Custom Actions
To create more sophisticated assistants, you will want to use Custom Actions.
Creating a Custom Action
Start by creating the custom actions in a directory actions:
mkdir actions
# Rasa SDK expects a python module.
# Therefore, make sure that you have this file in the directory.
touch actions/__init__.py
touch actions/actions.py
Then build a custom action using the Rasa SDK, e.g.:
import requests
import json
from rasa_sdk import Action
class ActionJoke(Action):
def name(self):
return "action_joke"
def run(self, dispatcher, tracker, domain):
request = requests.get('http://api.icndb.com/jokes/random').json() # make an api call
joke = request['value']['joke'] # extract a joke from returned json response
dispatcher.utter_message(joke) # send the message back to the user
return []
Next, add the custom action in your stories and your domain file.
Adding the Action Server
To instruct Rasa to use the action server you have to tell Rasa its location. Add this to your endpoints.yml (if it does not exist, create it):
action_endpoint:
url: http://action_server:5055/webhook
Adding a Custom Tracker Store
By default, all conversations are saved in memory. This means that all conversations are lost as soon as you restart the Rasa server. If you want to persist your conversations, you can use a different Tracker Store.
Using PostgreSQL as Tracker Store
Start by adding PostgreSQL to your docker-compose file:
postgres:
image: postgres:latest
Then add PostgreSQL to the tracker_store section of your endpoint configuration config/endpoints.yml:
type: sql
dialect: "postgresql"
url: postgres
db: rasa
Using MongoDB as Tracker Store
Start by adding MongoDB to your docker-compose file:
mongo:
image: mongo
environment:
MONGO_INITDB_ROOT_USERNAME: rasa
MONGO_INITDB_ROOT_PASSWORD: example
Then start all components with docker-compose up.