In this post, I'll show how to serve a simple Flask application with Gunicorn, running inside a Docker container.
Let's begin from creating a minimal Flask application:
from flask import Flask
app = Flask(__name__)
@app.route('/')
@app.route('/index')
def index():
return 'Hello world!'
Next, let's write the command that will run the Gunicorn server:
#!/bin/sh
gunicorn --chdir app main:app -w 2 --threads 2 -b 0.0.0.0:8003
The parameters are pretty much self-explanatory: We are telling Gunicorn to spawn 2 worker processes, running 2 threads each. We are also accepting connections from outside, and overriding Gunicorn's default port (8000).
Our basic Dockerfile:
FROM python:3.7.3-slim
COPY requirements.txt /
RUN pip3 install -r /requirements.txt
COPY . /app
WORKDIR /app
ENTRYPOINT ["./gunicorn_starter.sh"]
Let's build our image:
docker build -t flask/hello-world .
and run:
docker run -p 8003:8003 flask/hello-world
Now we should be able to access our endpoint:
$ curl localhost:8003
Hello world!
Bonus - Makefile
Let's create a simple Makefile that allows us to build, run and kill our image/container:
app_name = gunicorn_flask
build:
@docker build -t $(app_name) .
run:
docker run --detach -p 8003:8003 $(app_name)
kill:
@echo 'Killing container...'
@docker ps | grep $(app_name) | awk '{print $$1}' | xargs docker
Now we should be able to run:
# build Docker image
make build
# run the container
make run
# destroy it
make kill
Top comments (2)
If there is a
.env
file in the project will the gunicorn service read those variables?Where's contents of requirements.txt?
Is it similar to:
gunicorn
Flask