diff --git a/README.md b/README.md new file mode 100644 index 0000000..eeab8ab --- /dev/null +++ b/README.md @@ -0,0 +1,64 @@ +# 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.