Running dash app in docker container

#1

Has anyone been able to successfully run a Dash app in a Docker container? I’ve been able to easily run a Flask app but for some reason the same configuration with a Dash app does not work. I’m simply trying to run the Dash app in a container and access it locally but not having any luck :confused:

This is my Dockerfile:

FROM python:3.6

USER root

WORKDIR /app

ADD . /app

RUN pip install --trusted-host pypi.python.org -r requirements.txt

EXPOSE 80

ENV NAME World

CMD ["python", "app.py"]

This is the app (straight from Dash docs but am explicitly using Flask):

import dash
import dash_core_components as dcc
import dash_html_components as html
import flask

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

server = flask.Flask(__name__)
app = dash.Dash(__name__, server=server,external_stylesheets=external_stylesheets)
app.config.suppress_callback_exceptions = True


app.layout = html.Div(children=[
    html.H1(children='Hello Dash'),

    html.Div(children='''
        Dash: A web application framework for Python.
    '''),

    dcc.Graph(
        id='example-graph',
        figure={
            'data': [
                {'x': [1, 2, 3], 'y': [4, 1, 2], 'type': 'bar', 'name': 'SF'},
                {'x': [1, 2, 3], 'y': [2, 4, 5], 'type': 'bar', 'name': u'Montréal'},
            ],
            'layout': {
                'title': 'Dash Data Visualization'
            }
        }
    )
])

if __name__ == '__main__':
    app.run_server(port=8050)

Would ultimately like to deploy this to ECS but can’t even get it running locally with docker run -p 80:80 my_image_name

Thanks

#2

I’m having the same problem :frowning: hopefully someone knows!

#3

You need to expose port 8050 not 80 since that is the port you set when you run the app.

Then
docker run -p 8050:8050 my_image_name

#4

I got it working in ECS. Edit the app, include the host in the run_server command

app.run_server(host=‘0.0.0.0’,debug=True, port=8050)

#5

I was running into this issue as well, and the key for me was to override the default host and using “0.0.0.0”.

Originally I just had app.run_server(), and I was unable to access the running container from the browser with the IP and port shown with docker ps (or any variation that seemed possible). As soon as I added the host param and used app.run_server(host=‘0.0.0.0’) I was able to access the running container from the browser.