I have a very simple flask service that I’m trying to run inside a docker container.
I used python to implement a minimal application that is working fine on my Windows, but isn’t reachable when inside a Docker container.
I tried the common fix of setting –host=0.0.0.0 (tried multiple ways), but it did not solve my problem.
Project structure:
├── application/
│ ├── Dockerfile
│ ├── requirements.txt
│ ├── service.py
Dockerfile:
# syntax=docker/dockerfile:1 FROM python:3.6.5-alpine RUN apk --update add bash nano COPY requirements.txt /tmp/ RUN pip3 install -r /tmp/requirements.txt COPY . . ENV FLASK_ENV=development CMD ["python", "service.py"]
service.py:
from flask import Flask app = Flask(__name__) @app.route('/') def greetings(): return "Welcome my service!" if __name__ == '__main__': app.run(debug=True,host='0.0.0.0')
Finally, here’s the log when I start the Docker image in interactive mode:
[...]/.venv/Scripts/Activate.ps1" * Serving Flask app 'service' (lazy loading) * Environment: development * Debug mode: on * Running on all addresses. WARNING: This is a development server. Do not use it in a production deployment. * Running on http://172.17.0.2:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 277-473-905
So there appears to be no problems, however when I use a browser (Google Chrome) to visit the address shown in the console, it just loads forever then displays that the site is unreachable (ERR_CONNECTION_TIMED_OUT
).
Also, I can run the flask with no problem from my native OS by typing the following commands from a bash terminal:
export FLASK_APP=service export FLASK_ENV=development flask run
Can anybody help me understand why it’s not working inside a Docker container? It’s working from outside, and I thought adding host='0.0.0.0'
was supposed to make the container accessible from outside.
Edit: docker command tested:
docker run --rm -it scone:latest docker run --rm -p 5000:5000 scone:latest
RESOLVED
The trick, as mentioned by u/OneCricketeer, is to use -p 5000:5000
argument in docker run, and now you can use reach the container BUT you have to ignore the address given in the docker terminal. Use this instead : http://localhost:5000 (the ip it would give you if you ran flask from outside the docker container.)
Advertisement
Answer
The issue that you are likely seeing is that your windows host cannot get to the docker container. The networking is not exposed to your host so you’ll need to include the -p 5000:5000
option on the docker command line to tell docker to forward host port 5000 to the docker container port 5000.
In short:
docker run --rm -it -p 5000:5000 scone:latest