├── README.md ├── Dockerfile ├── docker-compose.yml ├── prod.yml ├── app ├── templates │ └── index.html ├── app.py └── test.py └── .circleci └── config.yml /README.md: -------------------------------------------------------------------------------- 1 | # dockerapp 2 | Project source code for James Lee's Docker course. 3 | 4 | Check out our latest DevOps PDF book. 5 | 6 | https://www.level-up.one/devops-pdf-book/ 7 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.5 2 | RUN pip install Flask==0.11.1 redis==2.10.5 3 | RUN useradd -ms /bin/bash admin 4 | USER admin 5 | COPY app /app 6 | WORKDIR /app 7 | CMD ["python", "app.py"] 8 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.0" 2 | services: 3 | dockerapp: 4 | build: . 5 | ports: 6 | - "5000:5000" 7 | depends_on: 8 | - redis 9 | redis: 10 | image: redis:3.2.0 11 | -------------------------------------------------------------------------------- /prod.yml: -------------------------------------------------------------------------------- 1 | version: "3.0" 2 | services: 3 | dockerapp: 4 | image: jleetutorial/dockerapp 5 | ports: 6 | - "5000:5000" 7 | depends_on: 8 | - redis 9 | redis: 10 | image: redis:3.2.0 11 | -------------------------------------------------------------------------------- /app/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | key value lookup service 4 | 5 | 6 |
7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | -------------------------------------------------------------------------------- /app/app.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, request, render_template 2 | import redis 3 | 4 | app = Flask(__name__) 5 | default_key = '1' 6 | cache = redis.StrictRedis(host='redis', port=6379, db=0) 7 | cache.set(default_key, "one") 8 | 9 | @app.route('/', methods=['GET', 'POST']) 10 | def mainpage(): 11 | 12 | key = default_key 13 | if 'key' in request.form: 14 | key = request.form['key'] 15 | 16 | if request.method == 'POST' and request.form['submit'] == 'save': 17 | cache.set(key, request.form['cache_value']) 18 | 19 | cache_value = None; 20 | if cache.get(key): 21 | cache_value = cache.get(key).decode('utf-8') 22 | 23 | return render_template('index.html', key=key, cache_value=cache_value) 24 | 25 | if __name__ == '__main__': 26 | app.run(host='0.0.0.0') 27 | -------------------------------------------------------------------------------- /app/test.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import app 3 | 4 | class TestDockerapp(unittest.TestCase): 5 | 6 | def setUp(self): 7 | self.app = app.app.test_client() 8 | 9 | def test_save_value(self): 10 | response = self.app.post('/', data=dict(submit='save', key='2', cache_value='two')) 11 | assert response.status_code == 200 12 | assert b'2' in response.data 13 | assert b'two' in response.data 14 | 15 | def test_load_value(self): 16 | self.app.post('/', data=dict(submit='save', key='2', cache_value='two')) 17 | response = self.app.post('/', data=dict(submit='load', key='2')) 18 | assert response.status_code == 200 19 | assert b'2' in response.data 20 | assert b'two' in response.data 21 | 22 | if __name__=='__main__': 23 | unittest.main() 24 | -------------------------------------------------------------------------------- /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | jobs: 3 | build: 4 | working_directory: /dockerapp 5 | docker: 6 | - image: docker:17.05.0-ce-git 7 | steps: 8 | - checkout 9 | - setup_remote_docker 10 | - run: 11 | name: Install dependencies 12 | command: | 13 | apk add --no-cache py-pip=9.0.0-r1 14 | pip install docker-compose==1.15.0 15 | - run: 16 | name: Run tests 17 | command: | 18 | docker-compose up -d 19 | docker-compose run dockerapp python test.py 20 | - deploy: 21 | name: Push application Docker image 22 | command: | 23 | docker login -e $DOCKER_HUB_EMAIL -u $DOCKER_HUB_USER_ID -p $DOCKER_HUB_PWD 24 | docker tag dockerapp_dockerapp $DOCKER_HUB_USER_ID/dockerapp:$CIRCLE_SHA1 25 | docker tag dockerapp_dockerapp $DOCKER_HUB_USER_ID/dockerapp:latest 26 | docker push $DOCKER_HUB_USER_ID/dockerapp:$CIRCLE_SHA1 27 | docker push $DOCKER_HUB_USER_ID/dockerapp:latest 28 | --------------------------------------------------------------------------------