service | ||
test | ||
.gitignore | ||
bitbucket-pipelines.yml | ||
Dockerfile | ||
Pipfile | ||
README.md |
python-service-1
Running a python REST application in a docker container
The idea behind this is to simply provide a barebones model for how to run a python based REST "service" in a docker container.
You can replace this "service" application with any python application, really. I've also included a small suite of pytests, to demonstrate how you could use the test suite to break your build if you mess something up.
All of this could be instrumented in a pipeline, which I'll probably do on my bitbucket for demo purposes.
To build the container:
> docker build -t python-service-1 .
You should get some output that looks like this:
> docker build -t python-service-1 . (0m)|*[master]
[+] Building 1.5s (13/13) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 37B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/python:3.9 1.4s
=> [auth] library/python:pull token for registry-1.docker.io 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 210B 0.0s
=> [1/8] FROM docker.io/library/python:3.9@sha256:e2cd43d291bbd21bed01bcceb5c0a8d8c50a9cef319a7b5c5ff6f85232e82021 0.0s
=> CACHED [2/8] COPY service/__init__.py /service/ 0.0s
=> CACHED [3/8] COPY service/requirements.txt /service/ 0.0s
=> CACHED [4/8] COPY service/simple.py /service/ 0.0s
=> CACHED [5/8] COPY test/test_simple.py /test/ 0.0s
=> CACHED [6/8] RUN pip install -r /service/requirements.txt 0.0s
=> CACHED [7/8] RUN export PYTHONPATH=$PYTHONPATH:./;pytest -v /test/test_*.py -r A 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:b4f9200147f5c908367bd60826f4e716a7003bec4161b4481492c5d6278b1a56 0.0s
=> => naming to docker.io/library/python-service-1 0.0s
If the pytest step fails, the build will fail.
To run the container:
> docker run -d -p 5000:5000 python-service-1
ee5f7e9b5384777a9b52c3bf829b88e0bac1a3eb4e612bdd721d480724e37eb5
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ee5f7e9b5384 python-service-1 "python /service/sim…" 10 seconds ago Up 9 seconds 0.0.0.0:5000->5000/tcp amazing_darwin
This should put the service on port 5000 on your localhost. You can hit it with curl commands for confirmation:
> curl -X POST -H "Content-Type: application/json" -d '{"name":"George"}' http://localhost:5000/hashname
{"hash": 7024223046703969137, "name": "George"}%
> curl http://localhost:5000/version
{"application": "Simple Api", "version": 0.1}%
One possible use for this, might be to teach API testing. It could also be coupled with a database or a web server, for additional testing demonstrations, for example, with selenium.