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.)
CodePudding user response:
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
CodePudding user response:
Tested with this Dockerfile
# syntax=docker/dockerfile:1
FROM python:3.10-alpine
RUN ["python", "-m", "pip", "install", "flask"]
COPY service.py .
CMD ["python", "service.py"]
Run with
$ docker build -t tmp-flask .
$docker run --rm -e FLASK_ENV=development -p 5000:5000 tmp-flask
* Serving Flask app 'service' (lazy loading)
* Environment: development
* Debug mode: on
* Running on all addresses (0.0.0.0)
WARNING: This is a development server. Do not use it in a production deployment.
* Running on http://127.0.0.1:5000
* Running on http://172.17.0.2:5000 (Press CTRL C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 248-506-880
From another terminal
$ curl localhost:5000
Welcome my service!