[PYTHON] De la construction de l'environnement au déploiement pour flask + Heroku avec Docker

introduction

Il y a environ un an, j'ai utilisé Django pour développer une application Web simple.

Une histoire sur tout, de la collecte de données au développement d'IA et à la publication d'applications Web en Python

Obtenir des données en grattant à partir de l'URL saisie → Inférer avec le modèle d'apprentissage automatique entraîné → Renvoyer la réponse C'est une chose très simple. Cliquez ici pour l'appli ↓ AI de discrimination clé

Après l'avoir utilisé pour la première fois depuis longtemps, je n'ai pas pu obtenir le résultat correct en raison du changement de spécification du site de destination du scraping. J'ai pensé que c'était mauvais et j'ai décidé de le réparer.

J'ai jeté un coup d'œil au code pour la première fois depuis un moment, mais je ne suis pas sûr ... Au moment du développement, je voulais quand même le faire fonctionner, donc le code est sale et je ne sais même pas comment le déployer ...

Donc, étant donné qu'il sera réparé de manière irrégulière à l'avenir, nous avons construit un environnement avec ** Docker ** pour faciliter le développement et le déploiement. Le but est de pouvoir se développer par clonage et docker-composer, tout en étant capable de se déployer d'un conteneur à heroku.

De plus, comme cette application elle-même n'utilise pas DB et est très simple, il n'est évidemment pas nécessaire d'utiliser Django, donc je vais la réécrire pour flask à cette occasion.

Le code est disponible sur Github. https://github.com/hatena-hanata/KJA_app

Structure du répertoire

Voici la structure finale des répertoires.

KJA_APP
├── Dockerfile
├── Procfile
├── app.py
├── docker-compose.yml
├── requirements.txt
└── src
    ├── modules
    │   ├── module.py
    │   └── music_class.py
    ├── static
    │   └── model
    │       ├── le.pkl
    │       └── model.pkl
    └── templates

Environnement

docker-compose.yml



version: '3'

services:
  web:
    build: .
    ports:
      - "8080:8080"
    volumes:
      - .:/home/KJA_APP
    tty: true
    environment:
      TZ: Asia/Tokyo
    command: flask run --host 0.0.0.0 --port 8080

Dockerfile


FROM python:3.8.0
USER root

# install google chrome
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
RUN apt-get -y update && apt-get install -y google-chrome-stable && apt-get install -yqq unzip

# install chromedriver
RUN wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip
RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/

# install heroku cli
RUN curl https://cli-assets.heroku.com/install.sh | sh

# set display port to avoid crash
ENV DISPLAY=:99

# upgrade pip
RUN apt-get update && apt-get install -y \
	&& pip install --upgrade pip

# change dir
WORKDIR /home/KJA_APP

# install module
COPY requirements.txt /home
RUN pip install -r /home/requirements.txt

# flask setting
ENV FLASK_APP '/home/KJA_APP/app.py'
ENV FLASK_DEBUG 1

Cette fois, afin d'exécuter le chrome avec du sélénium et de le gratter, j'ai d'abord installé le pilote chrome et chrome. J'ai fait référence au fichier docker de ici. J'ai également installé heroku cli pour le déploiement sur heroku.

Les deux dernières lignes, flask setting, sont les paramètres liés au flask. Dans FLASK_APP, en spécifiant le fichier py qui contient la fonction principale de flask, ce fichier sera exécuté par la commande flask run. Définir FLASK_DEBUG sur 1 vous met en mode débogage et permet aux mises à jour de fichiers d'être reflétées en temps réel.

Vous pouvez maintenant développer immédiatement avec git clone → docker-compose. Puisque nous exécutons la commande flask run pendant docker-compose, vous pouvez voir que l'application est en cours d'exécution en accédant à http: // localhost: 8080 /. image.png

Déployer sur Heroku

Il est supposé que vous vous êtes déjà inscrit en tant que membre d'Heroku.

Préparation

  1. requirements.txt
    Écrivez les bibliothèques requises dans requirements.txt. Vous avez besoin de gunicorn pour déployer, alors n'oubliez pas de l'installer avec pip.
  2. Procfile
    Créez directement sous le projet. Écrivez comme suit. L'application sur la gauche est app.py directement sous le projet, et l'application sur la droite est le nom de variable de l'instance Flask définie dans app.py? est. Il est difficile de comprendre ce que vous dites, alors veuillez lire ceci. https://stackoverflow.com/questions/19352923/gunicorn-causing-errors-in-heroku

Procfile


web: gunicorn app:app --log-file -

Création d'applications

Vous pouvez le faire depuis le terminal, mais c'est plus facile à comprendre depuis le navigateur, donc je le ferai depuis le navigateur.

  1. Connectez-vous à Heroku depuis votre navigateur https://id.heroku.com/login
  2. Créez une application avec Nouveau-> Créer une nouvelle application Donne lui un nom.
  3. Ajouter un pack de construction Pour indiquer clairement que cette application est python, ajoutez heroku / python à partir de Paramètres-> Buildpacks sur la page de l'application créée. (Il semble que python puisse être ajouté automatiquement au moment du déploiement, mais il n'a pas été reconnu comme un projet python car ma structure de répertoire était mauvaise, je recommande donc de l'ajouter manuellement à l'avance. .) En outre, cette fois, nous allons gratter avec du sélénium et du chrome, donc des pilotes de chrome et de chrome sont nécessaires. Cela peut également être géré en ajoutant un pack de construction. https://qiita.com/nsuhara/items/76ae132734b7e2b352dd#chrome%E3%81%A8driver%E3%81%AE%E8%A8%AD%E5%AE%9A

Déployer

De là, nous entrerons dans le conteneur Docker et le déploierons.

  1. Connectez-vous à heroku Je pense qu'un lien sortira, alors cliquez dessus pour vous authentifier.
root@a59194fe1893:/home/KJA_APP# heroku login
  1. Poussez vers le référentiel d'applications heroku. L'URL est https://git.heroku.com/ [nom de l'application créé en 2. ci-dessus] .git. (Vous pouvez également le vérifier dans les paramètres de votre navigateur). La commande ci-dessous signifie pousser le contenu de la branche courante vers la branche maître du référentiel heroku.
root@a59194fe1893:/home/KJA_APP# git push https://git.heroku.com/[Au-dessus de 2.Nom de l'application créé dans].git master

S'il n'y a aucune erreur, le déploiement est terminé.

finalement

docker-compose est pratique.

Recommended Posts

De la construction de l'environnement au déploiement pour flask + Heroku avec Docker
De Kafka à KSQL - Construction d'environnement facile avec docker
De la construction d'environnement Python à la construction d'environnement virtuel avec anaconda
Construction d'environnement virtuel avec Docker + Flask (Python) + notebook Jupyter
De Ubuntu 20.04 introduction à la construction d'environnement
Re: La vie d'Heroku à partir de zéro avec Flask ~ PhantomJS à Heroku ~
Vue.js + Mémorandum de construction de l'environnement Flask ~ avec Anaconda3 ~
Environnement de lancement avec LineBot + Heroku + Docker + Python
Lancez l'application Flask avec Docker sur Heroku
Re: La vie Heroku commence avec Flask from zero - Environnement et Hello world -
Comment télécharger avec Heroku, Flask, Python, Git (4)
Collecter des informations depuis Twitter avec Python (construction de l'environnement)
Construire un environnement d'analyse avec Docker (jupyter notebook + PostgreSQL)
Construction d'un environnement d'oreiller - Pour Docker + iPython (et OpenCV)
Impossible de se connecter à MySQL depuis l'environnement Docker (Debian)
Envoyer msgpack avec ajax à l'environnement flask (werkzeug)
De 0 à la construction de l'environnement de développement Django à l'exploitation de base
Notes de l'installation de Homebrew à la création d'un environnement Anaconda pour Python avec pyenv
Modèle de construction d'environnement de développement local Python [Flask / Django / Jupyter avec Docker + VS Code]
Construction de l'environnement: GCP + Docker
[Python] Construction de l'environnement OpenCV avec Docker (cv2.imshow () fonctionne également)
Comment télécharger avec Heroku, Flask, Python, Git (Partie 3)
Journal de sortie vers la console avec Flask + Nginx sur Docker
Comment télécharger avec Heroku, Flask, Python, Git (Partie 1)
Construction de l'environnement de contrôle à distance Pepper-kun avec Docker + IPython Notebook
Construction de l'environnement de développement Python 2020 [De l'installation de Python à l'introduction à la poésie]
Comment télécharger avec Heroku, Flask, Python, Git (Partie 2)
Construction d'environnement avec anyenv + pyenv (migrer depuis pyenv uniquement (Mac))
Exemple d'environnement pytest pour réparer la base de données avec Docker
Procédure pour convertir un fichier python en exe à partir de la construction de l'environnement Ubunts
Construction d'environnement pour ceux qui veulent étudier Python facilement avec VSCode (pour Mac)
[Avec diagramme d'image] Nginx + gunicorn + Flask converti en Docker [Partie 2]
Comment déployer une application Web créée avec Flask sur Heroku
OpenJTalk sur Windows10 (parler japonais avec Python depuis la construction de l'environnement)
Touch Flask + courir avec Heroku
[Memo] Construire un environnement de développement pour Django + Nuxt.js avec Docker
Construction de l'environnement Docker + Django + React
Préparer l'environnement python3 avec Docker
Construction de l'environnement Python3 (pour les débutants)
J'ai créé un environnement pour Masonite, un framework WEB Python similaire à Laravel, avec Docker!
Introduction à Python pour les utilisateurs de VBA - Appeler Python depuis Excel avec xlwings -
[Avec diagramme d'image] Nginx + gunicorn + Flask converti en Docker [Partie 1]
Construction de l'environnement Ansible pour Mac
Jusqu'à ce que l'API créée par Flask + MySQL soit convertie en Docker
[AWS] Version de déploiement d'application Flask qui a tenté de créer un environnement Python avec eb [Elastic Beanstalk]
Application Web réalisée avec Python + Flask (en utilisant VScode) # 1-Construction d'environnement virtuel-
Créer un environnement Python pour ceux qui veulent devenir des data scientists 2016
Comment déboguer Dash (Flask) dans Docker + VSCode + environnement de connexion à distance
De la création d'un environnement Python pour les personnes inexpérimentées à Hello world
Comment utiliser Jupyter Notebook sans polluer votre environnement avec Docker
Spigot (Paper) Introduction à la création d'un plug-in pour 2020 # 01 (Construction de l'environnement)
(Remarque) Remarques sur la création de l'environnement TensorFlow + Flask + Nginx avec Docker Compose
J'ai créé un environnement de développement pour Django 3.0 avec Docker, Docker-compose, Poetry
Construction d'environnement Postgres avec Docker J'ai eu un peu de mal, alors notez
Il est maintenant temps d'installer DB avec Docker! Installation de la base de données pour les débutants sur Docker
De l'installation ubuntu à l'exécution de kinect avec docker et ros (présentation)
De la construction de l'environnement PyCUDA à la programmation GPGPU sur Mac (MacOS 10.12 Sierra)