DASH on Google Cloud Run

You have built an awsome app using Python and Dash, but now you are wondering how could it be deployed.

Let me guide you through a simple 4 steps guide to have your DASH app moved from local to be deployed on your own domain.

The App

This is the core of the problem. You want to make sure that your app gets deployed effectively to the world, so that they can use it.

Make sure that you have your app.py including the following:

app = dash.Dash(__name__, external_stylesheets=['https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css'])

#...
#the rest of your app
#...

# Start of the application
if __name__ == '__main__':
    
    app.run_server(debug=False, host="0.0.0.0", port=8050)

The Docker Container

Dockerfile

You will need this file so that Docker will know:

  • Which base image to use
  • Where is your app.py located
  • Which libraries are to be included in the container
  • Which port is the one to be exposed
  • What to execute when the container will be running
# Use the official lightweight Python image.
# https://hub.docker.com/_/python
FROM python:3.8

# Copy local code to the container image.
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./

#COPY ./app ./ 
#source-destination

# Install production dependencies.
RUN pip install -r requirements.txt

EXPOSE 8050

CMD python ./app/app.py 

Dependencies

This will vary according to the libraries that your app uses.

Basically the idea is to include here ALL the packages, so that they will get included in the docker container with the version that you specified.

A requirements.txt file looks like this:

dash==2.7.0 
plotly==5.11.0

pandas==1.2.4
numpy==1.22.4

sympy==1.7.1
scipy==1.7.1

Deploying the App

Once you will have your container in DockerHub, you can deploy it to Google Cloud Run in few clicks:

  • Create a Service
  • Provide the container’s URL - For example: docker.io/your_dockerhub_user/your_container_name:latest
  • Choose the Port - For example: 8050
  • Assign resources

This will publish your app in a Google’s domain. But what if you want to user your own?

Mapping Domains

  • Visit https://console.cloud.google.com/run/domains?
  • Add a mapping
    • Select the service to map - the GCR instance that we just created
    • Specify domain
  • Update the CNAME as GCR will indicate
    • For example: connect.domains.google.com

Optional - CI/CD Pipeline

It would be great to have your code changes automatically deployed to DockerHub, so that GCR can read the newest image.

You can check this post to learn how to use Github Actions to create and deploy Docker containers for you.

Examples