[PYTHON] C'était un peu difficile de faire flacon avec la version docker de nginx-unit

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.

image de docker

Doc officiel ↓

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 .

J'ai essayé de déplacer le ballon

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)

config.json pour nginx-unit

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 /

*** Ce qui était important ***

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

Enquête auprès des utilisateurs dans le conteneur

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

Ce que je pensais

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?

Recommended Posts

C'était un peu difficile de faire flacon avec la version docker de nginx-unit
Un mémo sur la façon de surmonter le problème difficile de la capture d'effets avec l'IA
Un débutant a essayé de colorier un dessin au trait avec un chainer. J'ai pu le faire.
Un diagramme de réseau a été créé avec les données du COVID-19.
Le son émis par M. Tick sur le lieu de travail est ... J'ai réussi à le faire avec le code
Notez ce que vous voulez faire à l'avenir avec Razpai
Renvoyez les données d'image avec Flask of Python et dessinez-les dans l'élément canvas de HTML
Étapes pour configurer Pipenv, créer une application CRUD avec Flask et la conteneuriser avec Docker
L'histoire selon laquelle la version de python 3.7.7 n'était pas adaptée à Heroku
Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python
Créer un serveur Flask avec Docker
[Introduction à StyleGAN] J'ai joué avec "The Life of a Man" ♬
Que faire lorsqu'une partie de l'image d'arrière-plan devient transparente lorsque l'image transparente est combinée avec Oreiller
J'ai réussi à convertir jpg en png car la transparence n'a pas été altérée
L'histoire de la création d'un outil pour charger une image avec Python ⇒ l'enregistrer sous un autre nom
Mettez à jour les données en les téléchargeant sur s3 d'aws avec une commande, et supprimez les données utilisées (en chemin)
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
Comment vérifier la version de Django
Créer un service Web avec Docker + Flask
Dans IPython, quand j'ai essayé de voir la valeur, c'était un générateur, donc je l'ai inventé quand j'étais frustré.
Je voulais connaître le nombre de lignes dans plusieurs fichiers et j'ai essayé de l'obtenir avec une commande
Le fichier édité avec vim était en lecture seule, mais je veux le sauvegarder
Pour générer une valeur au milieu d'une cellule avec Jupyter Notebook
P100-PCIE-16GB a été ajouté au GPU de Google Colab avant que je le sache
Notez la solution car django n'a pas pu s'installer avec pip
Si vous les gars dans la cuisine de portée pouvez le faire avec une marge ~ ♪
Connexion SSH au serveur cible à partir de Windows en un clic sur un raccourci
Que faire si une erreur de version se produit dans le pilote Selenium Chrome
Facilitez la spécification de l'heure d'AWS CloudWatch Events avec CDK.
Comment obtenir une liste de fichiers dans le même répertoire avec python
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
J'ai réussi à le faire parce que la coutume de joindre un zip avec un mot de passe à un e-mail et de dire «Je vous enverrai le mot de passe séparément» est gênante.
Remarque: préparez l'environnement de CmdStanPy avec docker
Préparer l'environnement d'exécution de Python3 avec Docker
L'inexactitude de Tensorflow était due à log (0)
Écrire une note sur la version python de python virtualenv
Enregistrer l'objet dans un fichier avec pickle
Je vais résumer ce que j'ai été heureux de faire pour sortir de l'état où je ne connais même pas la lettre D de Docker
Essayez de créer une table d'enregistrement de bataille avec matplotlib à partir des données de "Schedule-kun"
Quand j'ai essayé de faire une communication socket avec Raspberry Pi, le protocole était différent
C'était une vie que je voulais faire de l'OCR sur AWS Lambda pour localiser les personnages.
Je souhaite prendre une capture d'écran du site sur Docker en utilisant n'importe quelle police
Ce que j'ai fait quand j'étais en colère de le mettre avec l'option enable-shared
Une note de malentendu lors de la tentative de chargement de l'intégralité du module self-made avec Python3
Une histoire sur la tentative d'introduire Linter au milieu d'un projet Python (Flask)
[C'était une spécification de curl & HTTP] Lorsque Flask avec uWSGI est exécuté par HTTP, il y a un délai de nettoyage de 1 seconde lors de la publication d'un fichier.
Je n'aime pas être frustré par la sortie de Pokemon Go, j'ai donc créé un script pour détecter la sortie et le tweeter
Mémo connecté à HiveServer2 d'EMR avec python
Je veux faire la transition avec un bouton sur le ballon
Un mémo pour comprendre visuellement l'axe des pandas.
Python Ver. Présentation de WebPay avec un peu de code
Prenez des captures d'écran LCD avec Python-LEGO Mindstorms
[PyTorch] Un peu de compréhension de CrossEntropyLoss avec des formules mathématiques
Journal de sortie vers la console avec Flask + Nginx sur Docker
Essayez d'obtenir le contenu de Word avec Golang
Visualisez le vocabulaire caractéristique d'un document avec D3.js