Le paquet nginx-unit fonctionnait bien comme avant, mais le docker ne fonctionnait pas très bien et j'ai eu du mal. Je n'ai pas beaucoup écrit officiellement, alors je vais l'écrire.
https://unit.nginx.org/howto/docker/#running-apps-in-containerized-unit
Puisque vous appuyez d'abord sur apt, vous pouvez créer une image après avoir appuyé sur apt. (Parce qu'il était gênant d'attendre avec apt lorsqu'une erreur se produisait ...)
FROM nginx/unit:1.19.0-python3.7
RUN apt-get update && apt-get install -y python3-pip \
&& rm -rf /var/lib/apt/lists/*
Construisez simplement avec le nom (faites-en un nom approprié)
docker build -t nginx-unit-python .
Le flacon lui-même utilise un exemple créé par Visual Studio. Cliquez ici pour github https://github.com/microsoft/python-sample-vs-learning-flask
(En fait, je l'ai changé pour qu'il fonctionne depuis app.py)
Ceci est également requis pour la version docker, alors créez-le
config.json
{
"listeners":{
"*:8000":{
"pass":"applications/webapp"
}
},
"applications":{
"webapp":{
"type":"python 3",
"path":"/www/",
"module":"app"
}
}
}
Donc, le dockerfile pour l'image de l'application
FROM nginx-unit-python:latest
COPY requirements.txt /config/requirements.txt
RUN pip3 install --no-cache-dir -r /config/requirements.txt \
&& rm -rf /var/lib/apt/lists/*
COPY ./config /docker-entrypoint.d/ # config.Insérer json
COPY --chown=nobody:nogroup webapp/ /www/ #chown important
EXPOSE 8000
L'image utilise l'image locale créée ci-dessus. Bien sûr, vous n'avez pas à créer une image une fois, vous pouvez simplement entrer la commande apt.
Pour le moment, envoyez-le à la commande officielle et copiez-le. (Bien que l'officiel soit inclus avec l'option de liaison)
Mettez requirements.txt
dans / config
et pip
Mettez config.json
dans / docker-entrypoint.d /
Il y a un flacon dans webapp /
et je le mets dans / www
, mais s'il est tel quel
Lors de la lecture d'un modèle, je reçois «prémission refusée» et cela ne fonctionne pas.
2020/08/21 13:45:42 [alert] 19#19 Python failed to import module "views"
Traceback (most recent call last):
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 724, in exec_module
File "<frozen importlib._bootstrap_external>", line 859, in get_code
File "<frozen importlib._bootstrap_external>", line 916, in get_data
PermissionError: [Errno 13] Permission denied: '/www/views.py'
Comme ça. (La même autorisation refusée est indiquée dans le modèle)
Je pensais juste que le conteneur Docker fonctionnait en tant que racine de base, donc j'étais vraiment dedans ici.
Vous ne pouvez pas modifier l'emplacement de diverses applications.
Je n'avais pas d'autre choix que d'entrer dans le conteneur et de changer le numéro ci-dessous / www
en 777 et cela a bien fonctionné.
Qu'est-ce que c'est que ça? J'ai pensé, donc je vais étudier quel type de processus est en cours d'exécution dans le conteneur.
(Notez que la commande ps aux
à l'intérieur du conteneur ne peut pas être utilisée)
docker container top [container id]
Regarder
UID PID PPID C STIME TTY TIME CMD
root 27891 27874 0 13:50 ? 00:00:00 unit: main v1.19.0 [unitd --no-daemon --control unix:/var/run/control.unit.sock]
nobody 27947 27891 0 13:50 ? 00:00:00 unit: controller
nobody 27948 27891 0 13:50 ? 00:00:00 unit: router
nobody 27949 27891 0 13:50 ? 00:00:00 unit: "webapp" application
↑ C'était comme ça.
Donc, si vous regardez de plus près, le corps principal de l'unité semble fonctionner avec «personne».
Vérifiez également le groupe «personne». Entrez dans le conteneur
# groups nobody
→ no group
est renvoyé.
Alors, ajoutez l'option --chown lors de la copie. (Au début, il est devenu chmod dans le fichier docker, et je pensais que ce serait inutile si je n'incluais pas chown, mais il semble qu'une option ait été faite) https://ken5scal.hatenablog.com/entry/2017/10/13/DockerfileのADD/COPYに--chownオプションができた ↑ Je l'ai utilisé comme référence. Merci beaucoup.
Maintenant ça marche bien. très
Il est difficile d'utiliser celui avec peu d'informations. Surtout ceux qui ont peu d'informations sur la dernière version ... Cela signifie-t-il que vous pouvez utiliser uWSGI standard, etc. parce que vous pouvez faire demi-tour à la hâte?