In a recent post, I produced a simple script that can used to poll a set of ports and propagate their status with a fail-safe (-safe, not -proof, i.e., fails to safety) option to override that status (with an HTTP 503) allowing investigation and safe shutdown of critical services.
As a follow-up, but with no particular significance, this post is an excuse to prepare a Docker container that runs the service. On a Raspberry-Pi.
My approach for this is to start with a base image and build python container, then use that to prepare a uwsgi container, which can then be used to launch a simple F;ask service.
I use the Hypriot distribution for the Pi and they provide a good Dockerfile to get things started.
# Taken from https://github.com/hypriot/rpi-python/blob/master/Dockerfile # Pull base image FROM resin/rpi-raspbian:wheezy MAINTAINER Cleverer Thanme <firstname.lastname@example.org> # Install dependencies RUN apt-get update && apt-get install -y \ python \ python-dev \ python-pip \ python-virtualenv \ --no-install-recommends && \ rm -rf /var/lib/apt/lists/* # Define working directory WORKDIR /data # Define default command CMD ["bash"]
Then we create the container image with,
docker build --rm=true --tag=localhost/my-user:hpyriot-python
Then we follow that with the wsgi image Dockerfile,
# Based on local python base image #FROM resin/rpi-raspbian:wheezy FROM localhost/my-user:hpyriot-python MAINTAINER Inspired Byothers <email@example.com> # Install dependencies RUN apt-get update && \ apt-get install -y build-essential python-dev && \ pip install \ Flask \ uwsgi \ requests && \ apt-get purge --auto-remove build-essential python-dev # Define working directory WORKDIR /data # Define default command CMD ["bash"]
With the image coming from,
docker build --rm=true --tag=localhost/my-user:hpyriot-python-wsgi
And the service container is described by,
# Based on local python uwsgi image with Flask pip installed #FROM resin/rpi-raspbian:wheezy FROM localhost/my-user:hypriot-python-wsgi MAINTAINER Thisone Onme <firstname.lastname@example.org> # Install application files ADD side-channel-monitor.py /var/www/uwsgi/flask/side-channel-monitor/side-channel-monitor.py # Make a port externally available EXPOSE 7071 # Define working directory WORKDIR /var/www/uwsgi/flask/side-channel-monitor # Define default command CMD ["uwsgi", "--wsgi-file", "/var/www/uwsgi/flask/side-channel-monitor/side-channel.py", "--callable", "app", "--processes", "4", "--threads", "2", "--uid", "nobody", "--gid", "nogroup", "--http", "0.0.0.0:7071", "--logto", "/var/log/side-channel-monitor.log"]
And the image appears after,
docker build --rm=true --tag=localhost/my-user:python-wsgi-side-channel
And we can the deploy a container using,
docker run --rm -p 9880:7071 -d --name side-channel-monitor localhost/my-user:python-wsgi-side-channel
This maps the exposed container port (7071) to host port 9880.
And then check the connection with,
curl -v http://localhost:9880/side-channel-monitor/healthcheck
(This obviously requires a backend service for the monitor to connect to).
Although linked to in the post,
- https://github.com/hypriot/rpi-python/blob/master/Dockerfile – base image Dockerfile
- https://blog.hypriot.com/ – Running docker on a Raspberry Pi