web-dev-qa-db-fra.com

comment exécuter gunicorn sur docker

J'ai 2 fichiers qui dépendent les uns des autres lorsque le menu fixe est démarré. 1 est un fichier de flacon et un fichier contient quelques fonctions. Lorsque docker démarre, seul le fichier de fonctions est exécuté, mais il importe des variables de flacon à partir du fichier de flacon. Exemple:

Flaskfile

import flask
from flask import Flask, request
import json

_flask = Flask(__name__)

@_flask.route('/', methods = ['POST'])
def flask_main():
    s = str(request.form['abc'])
    ind = global_fn_main(param1,param2,param3)
    return ind

def run(fn_main):
    global global_fn_main
    global_fn_main = fn_main
    _flask.run(debug = False, port = 8080, Host = '0.0.0.0', threaded = True)

Fichier principal

import flaskfile
#a few functions then
if__== '__main__':
    flaskfile.run(main_fn)

Le script fonctionne bien sans avoir besoin d'un gunicorn.

Dockerfile

  FROM python-flask
  ADD *.py *.pyc /code/
  ADD requirements.txt /code/
  WORKDIR /code
  EXPOSE 8080
  CMD ["python","main_file.py"]

Dans la ligne de commande: je fais habituellement: docker run -it -p 8080:8080 my_image_name et docker démarre et écoute.

Maintenant, pour utiliser gunicorn: j'ai essayé de modifier mon paramètre CMD dans le fichier de dock en

["gunicorn", "-w", "20", "-b", "127.0.0.1:8083", "main_file:flaskfile"]

mais il ne cesse de sortir. Est-ce que je n'écris pas le commandement du docker gunicorn, n'est-ce pas?

3
jxn

Je viens d’examiner ce problème cette semaine et j’ai trébuché sur votre question. Il est juste de dire que vous avez résolu ce problème ou que vous avez changé d’approche, mais pour l’avenir:

La commande dans mon fichier Docker est la suivante:

CMD ["gunicorn"  , "-b", "0.0.0.0:8000", "app:app"]

Où la première "application" est le module et la deuxième "application" est le nom de l'appelable WSGI, dans votre cas, il devrait être _flask de votre code bien que vous ayez d'autres tâches en cours qui me rendent moins certain.

Gunicorn remplace toutes les instructions d'exécution de votre code. Si le serveur Web de développement de Flask et Gunicorn tentent de prendre le même port, ils peuvent entrer en conflit et provoquer le crash de Gunicorn.

Notez que lorsqu'il est exécuté par Gunicorn, __name__ n'est pas "principal". Dans mon exemple, il est égal à "app".

A mon niveau, certes junior, de Python, Docker et Gunicorn, le moyen le plus rapide de déboguer est de commenter le "CMD" dans le fichier Dockerfile, pour que le conteneur soit opérationnel:

docker run -it -d -p 8080:8080 my_image_name

Sautez sur le conteneur en cours d'exécution:

 docker exec -it container_name /bin/bash

Et lancez Gunicorn depuis la ligne de commande jusqu'à ce que tout fonctionne, puis testez avec curl - je garde dans mon fichier app.py une route de base qui affiche simplement "Salut" et n'a pas de dépendances pour valider que le serveur est activé avant de s'inquiéter à propos de la liaison du port à la machine hôte.

8
user7504939

Ceci est ma dernière partie de mon Dockerfile avec Django App

EXPOSE 8002
COPY entrypoint.sh /code/
WORKDIR /code
ENTRYPOINT ["sh", "entrypoint.sh"]

puis dans entrypoint.sh

#!/bin/bash

# Prepare log files and start outputting logs to stdout
mkdir -p /code/logs
touch /code/logs/gunicorn.log
touch /code/logs/gunicorn-access.log
tail -n 0 -f /code/logs/gunicorn*.log &

export Django_SETTINGS_MODULE=Django_docker_Azure.settings

exec gunicorn Django_docker_Azure.wsgi:application \
    --name Django_docker_Azure \
    --bind 0.0.0.0:8002 \
    --workers 5 \
    --log-level=info \
    --log-file=/code/logs/gunicorn.log \
    --access-logfile=/code/logs/gunicorn-access.log \
"$@"

J'espère que cela pourrait être utile

0
e.arbitrio