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?
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.
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