← Home

Запуск Flask в docker

By Брендель В. М.

https://verstaem.com/devops/docker-php-development/

https://habrahabr.ru/post/322440/

https://ru.stackoverflow.com/questions/745649/%D0%9A%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D1%8B-docker-%D0%BD%D0%B0-%D0%BE%D0%B4%D0%BD%D0%BE%D0%BC-%D0%BF%D0%BE%D1%80%D1%82%D1%83

https://ifmo.su/docker-php

https://system-admins.ru/nginx-dlya-balansirovki-nagruzki-v-klastere-docker/

https://habrahabr.ru/post/314012/

https://habrahabr.ru/post/311890/

Из крон в яндекс диск.

#!/bin/bash TIME=date +%Y-%m-%d-%H-%M-%S SERVER_NAME="SERVER_NAME" MYSQL_FILE=/tmp/$SERVER_NAME-mysql.$TIME.sql.gz FS_FILE=/tmp/$SERVER_NAME-fs.$TIME.tar.gz # Archiving databases mysqldump -u MYSQL_USER --password=MYSQL_USER_PASS MYSQL_DB | gzip > $MYSQL_FILE if [ -f $MYSQL_FILE ]; then echo $TIME" db dump created" # Uploading to the cloud curl --user YA_USER@yandex.ru:YA_PASS -T "{$MYSQL_FILE}" https://webdav.yandex.ru/backup/database/ #Delete archve rm $MYSQL_FILE fi # Archiving filesystem tar czfP $FS_FILE /var/www/SITE_PATH if [ -f $FS_FILE ]; then echo $TIME" fs achive created" # Uploading to the cloud curl --user YA_USER@yandex.ru:YA_PASS -T "{$FS_FILE}" https://webdav.yandex.ru/backup/files/ #Delete archve rm $FS_FILE fi

Запуск Python Flask в докере

  1. Пишем доккер файл с минимальным образом (ось - Alpine Linux, Python и зависимости к питону). Bash, gcc и прочей шелухи нет.

FROM python:3.6.5-alpine MAINTAINER: BVM #В будущем в COPE нужно прописать путь, куда будут сохраняться инфо #после гашения образа эта инфа не пропадет COPY ./ WORKDIR / RUN pip3 install -r requirements.txt ENTRYPOINT ["python"] CMD ["flask_test.py"]

  1. Пишем requirements.txt

Flask

  1. Пишем flask_test.py

from flask import Flask app = Flask(name)

@app.route('/') def hello_world(): return 'Flask in container'

if name == 'main': app.run(debug=True, host='0.0.0.0')

  1. Создаем контейнер

docker build -t flask_test docker images - посмотреть доступные образы docker run -d -p 80:5000 flask_test - запускает образ с проброской 80 порта из образа в 5000 хостовой os docker ps -a -q - посмотреть запущенные образы docker stop $(docker ps - a -q) - остановить все запущенные образы docker rm $(docker ps - a -q) - удалить все образы

5.localhost:5000 Видим в броузере Flask in container

Промежуточный итог по созданию окружения и деплоя. Ставим VmWare, качаем образ ubuntu 18 LTS live server. Заводим пользователя, пароль. Делаем сеть Bridge, при этом виртуалка получит IP от DHCP роутера, хост и вирт будут в одной подсети с разными IP. ifconfig /all - посмотреть все сетевые соединения. На хост машине расшарить интернет, тогда виртуалка сможет ходить в инет. По умолчанию в ubuntu ufw отключен, можно пользоваться.

Ставим VmWare tools, что позволит монтировать папку с сырцами из хост машины прямо в виртуалку. sudo mkdir /mnt/cdrom ls /mnt/cdrom tar xzvf /mnt/cdrom/VMwareTools-x.x.x-xxxx.tar.gz -C /tmp/ cd /tmp/vmware-tools-distrib/ sudo ./vmware-install.pl -d sudo reboot Грузит с диска, запускает скрипт перла, ставит (нужен перл, по умолчанию есть в убунту). Проверяем чтобы в настройках виртуальной машине была указана папка для шары, иначе не сработает монтирование hgfs. sudo /etc/init.d/vmware-tools start Создаем символическую ссылку в свой домашний каталог. mkdir /home/bvm84/flask ln - s /mnt/hgfs/flask /home/bvm84/flask cd /home/bvm84/flask rm flask - удалить симв. ссылку (rmdir - удалить директорию)

Ставим docker sudo apt-get install docker-ce (возможно поставит не последнюю версию, неважно). Еще нужно chmod и чтобы docker без sudo Ставим docker-compose sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose docker-compose --version

Пишем образ для flask FROM python:3.6.5-alpine MAINTAINER Brendel Vadim brendel.vadim@gmail.com COPY . /app WORKDIR /app RUN file="$(ls -1 /app)" && echo $file

RUN pip3 install -r requirements.txt

ENTRYPOINT ["python"] CMD ["test_run.py"]

Делаем образ и сразу ставим ему таг docker build -f docker_python -t flaskbp:latest docker tag flaskbp bvm84/flaskbp docker login docker push bvm84/flaskbp

Пишем docker-compose yml файл version: '3' //версия docker-compose services: flask: image: bvm84/flaskbp web-server: image: nginx:alpine ports:

Запуск docker-compose -f docker_flask_compose.yml up -d без -d зависает в attaching, что-то связано с логами, непонятно что. docker-compose -f docker_flask_compose.yml down - гасит все Как то оно соберется или нет. Зависит от верности eml файла.

Окончательный вариант

Dockerfile

FROM python:3.6.5-alpine MAINTAINER Brendel Vadim brendel.vadim@gmail.com

install dependencies

the lapack package is only in the community repository

RUN echo "http://dl-4.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories RUN apk --update add --no-cache
lapack-dev
gcc
freetype-dev

Install dependencies

RUN apk add --no-cache --virtual .build-deps
gfortran
musl-dev
g++ RUN ln -s /usr/include/locale.h /usr/include/xlocale.h

COPY . /app WORKDIR /app RUN file="$(ls -1 /app)" && echo $file RUN pip3 install -r requirements.txt

removing dependencies

RUN apk del .build-deps

EXPOSE 5090 ENTRYPOINT ["python"] CMD ["test_run.py"]

.dockerignore

.git .idea pycache conf.d venv

flaskapp.conf

server { listen 80; server_name localhost;

location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host;

proxy_pass http://flaskapp:5090; } }

docker-compose.yml

version: '3' services: flaskapp: build: context: . networks:

nginx: image: nginx:alpine ports:

volumes:

depends_on:

networks:

networks: web_nw: driver: bridge

test_app.py

from flask import Flask, request, render_template

app = Flask(name)

@app.route('/') def my_form(): return render_template('my_form.html')

@app.route('/', methods=['POST']) def my_form_post(): text = request.form['text'] processed_text = text.upper() return processed_text

if name == 'main': app.run(debug=True, host='0.0.0.0', port=5090)

docker-compose build --no-cache - cоздаем образы. docker-compose down --rmi all - гасим и удаляем. docker-compose up -d - поднимает образы docker-compose down - гасит образы docker-compose logs flaskbp_flaskapp_1 - выводит лог

Из-за дебильной винды, чтобы простировать API приходится писать вот такой изврат: curl -X PUT -H "Content-Type: application/json" -d "{ "id": "1212", "upw": [12, 12, 13] }" http://localhost:5090/123 curl -X PUT -H "Content-Type: application/json" -d @data.json http://localhost:5090/123

curl -X GET -H "Content-Type: application/json" -d @data.json http://localhost:5090/api/get_bp curl -X GET -H "Content-Type: application/json" -d @put_data.json http://localhost:5090/api/db_service curl -X GET http://localhost:5090/api/db_service?action=db_list