[PYTHON] Mit der Docker-Version der Nginx-Einheit war es ein wenig schwierig, eine Flasche zu machen

Das Paket Nginx-Unit funktionierte gut wie zuvor, aber der Docker funktionierte nicht sehr gut und ich hatte es schwer. Ich habe nicht viel in der offiziellen Form geschrieben, also werde ich es aufschreiben.

Docker-Bild

Offizielles Dokument ↓

https://unit.nginx.org/howto/docker/#running-apps-in-containerized-unit

Da Sie zuerst auf apt klicken, können Sie nach dem Auftreffen auf apt ein Bild erstellen. (Weil es mühsam war, mit apt zu warten, wenn ein Fehler auftrat ...)

FROM nginx/unit:1.19.0-python3.7

RUN apt-get update && apt-get install -y python3-pip \
    && rm -rf /var/lib/apt/lists/*

Bauen Sie einfach mit dem Namen (machen Sie einen passenden Namen daraus) docker build -t nginx-unit-python .

Ich habe versucht, die Flasche zu bewegen

Der Kolben selbst verwendet ein von Visual Studio erstelltes Beispiel. Klicken Sie hier für Github https://github.com/microsoft/python-sample-vs-learning-flask

(Eigentlich habe ich es geändert, um von app.py zu funktionieren)

config.json für nginx-unit

Dies ist auch für die Docker-Version erforderlich. Erstellen Sie sie daher

config.json


{
  "listeners":{
    "*:8000":{
      "pass":"applications/webapp"
    }
  },
  "applications":{
    "webapp":{
      "type":"python 3",
      "path":"/www/",
      "module":"app"
    }
  }
}

Also die Docker-Datei für das App-Image

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.Fügen Sie json ein
COPY --chown=nobody:nogroup webapp/ /www/  #chown wichtig

EXPOSE 8000

Das Bild verwendet das oben erstellte lokale Bild. Natürlich müssen Sie kein einziges Mal ein Bild erstellen, sondern können einfach den Befehl apt eingeben.

Senden Sie es vorerst an den offiziellen Befehl und kopieren Sie es. (Obwohl der Beamte in der Bindungsoption enthalten ist)

Setzen Sie require.txt in / config und pip

Fügen Sie config.json in / docker-entrypoint.d / ein

*** Was war wichtig ***

Es gibt eine Flasche in "webapp /" und ich habe diese in "/ www" eingefügt, aber wenn es so ist wie es ist Wenn ich eine Vorlage lese, wird mir "Vorlauf verweigert" und es funktioniert nicht.

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'

So was. (Die gleiche verweigerte Erlaubnis wird in der Vorlage angegeben.) Ich dachte nur, dass der Docker-Container als Basis-Root ausgeführt wird, also war ich hier wirklich begeistert. Sie können den Standort verschiedener Apps nicht ändern. Ich hatte keine andere Wahl, als in den Container zu gehen und den Bereich unter / www auf 777 zu ändern, und es funktionierte.

Benutzerumfrage im Container

Was um alles in der Welt ist das? Ich dachte, also werde ich untersuchen, welche Art von Prozess im Container läuft. (Beachten Sie, dass der Befehl ps aux im Container nicht verwendet werden kann.) docker container top [container id] Anschauen

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

↑ Es war so. Wenn Sie genau hinschauen, scheint der Hauptteil des Geräts mit "niemandem" zu laufen. Überprüfen Sie auch die Gruppe "Niemand". Geh in den Behälter # groups Nobody no group wird zurückgegeben.

Fügen Sie daher beim Kopieren die Option --chown hinzu. (Zuerst wurde es chmod in der Docker-Datei, und ich dachte, dass es nutzlos wäre, wenn ich chown nicht einschließen würde, aber es scheint, dass eine Option gemacht wurde) https://ken5scal.hatenablog.com/entry/2017/10/13/DockerfileのADD/COPYに--chownオプションができた ↑ Ich habe es als Referenz verwendet. Vielen Dank.

Jetzt funktioniert es gut. sehr

Was ich dachte

Es ist schwer, die mit wenig Informationen zu verwenden. Besonders diejenigen mit wenig Informationen über die neueste Version ... Bedeutet das, dass Sie Standard-uWSGI usw. verwenden können, weil Sie sich schnell umdrehen können?

Recommended Posts

Mit der Docker-Version der Nginx-Einheit war es ein wenig schwierig, eine Flasche zu machen
Ein Memo darüber, wie man das schwierige Problem der Erfassung von FX mit AI überwinden kann
Ein Anfänger versuchte, eine Strichzeichnung mit einem Kettenmesser zu färben. Ich konnte es schaffen.
Mit den Daten von COVID-19 wurde ein Netzwerkdiagramm erstellt.
Das Geräusch von Mr. Tick am Arbeitsplatz ist ... Ich habe es mit dem Code geschafft
Notieren Sie sich, was Sie in Zukunft mit Razpai machen möchten
Geben Sie die Bilddaten mit Flask of Python zurück und zeichnen Sie sie in das Canvas-Element von HTML
Schritte zum Einrichten von Pipenv, Erstellen einer CRUD-App mit Flask und Containerisieren mit Docker
Die Geschichte, dass die Version von Python 3.7.7 nicht an Heroku angepasst wurde
Eine Geschichte über das Schreiben von AWS Lambda und ein wenig Abhängigkeit von den Standardwerten von Python-Argumenten
Erstellen eines Flask-Servers mit Docker
[Einführung in StyleGAN] Ich habe mit "The Life of a Man" ♬ gespielt
Was tun, wenn ein Teil des Hintergrundbilds transparent wird, wenn Sie transparente Bilder mit Pillow kombinieren?
Selbst wenn ich jpg in png konvertiert habe, habe ich es geschafft, weil die Transparenz nicht manipuliert wurde
Die Geschichte, ein Tool zum Laden von Bildern mit Python zu erstellen ⇒ Speichern unter
Laden Sie Daten mit einem Befehl und einer Aktualisierung auf s3 von aws hoch und löschen Sie die verwendeten Daten (unterwegs).
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
So überprüfen Sie die Version von Django
Erstellen Sie einen Webdienst mit Docker + Flask
Als ich in IPython versuchte, den Wert zu sehen, war es ein Generator, also kam ich auf ihn, als ich frustriert war.
Ich wollte die Anzahl der Zeilen in mehreren Dateien wissen und versuchte, sie mit einem Befehl abzurufen
Die mit vim bearbeitete Datei war schreibgeschützt, aber ich möchte sie speichern
So geben Sie mit Jupyter Notebook einen Wert in der Mitte einer Zelle aus
P100-PCIE-16GB wurde der GPU von Google Colab hinzugefügt, bevor ich es wusste
Beachten Sie die Lösung, da Django nicht mit pip installiert werden konnte
Wenn ihr in der Scope-Küche das mit einem Rand machen könnt ~ ♪
SSH-Anmeldung am Zielserver von Windows mit einem Klick auf eine Verknüpfung
Was tun, wenn im Selenium Chrome-Treiber ein Versionsfehler auftritt?
Machen Sie es sich einfach, die Zeit von AWS CloudWatch-Ereignissen mit CDK anzugeben.
So erhalten Sie mit Python eine Liste der Dateien im selben Verzeichnis
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
[Einführung in Python] So erhalten Sie den Datenindex mit der for-Anweisung
Ich habe es geschafft, weil der Brauch, eine Zip mit einem Passwort an eine E-Mail anzuhängen und "Ich werde Ihnen das Passwort separat senden" zu sagen, mühsam ist.
Hinweis: Bereiten Sie die Umgebung von CmdStanPy mit Docker vor
Bereiten Sie die Ausführungsumgebung von Python3 mit Docker vor
Die Ungenauigkeit von Tensorflow war auf log (0) zurückzuführen.
Schreiben Sie eine Notiz über die Python-Version von Python Virtualenv
Speichern Sie das Objekt in einer Datei mit pickle
Ich werde zusammenfassen, was ich gerne getan habe, um aus dem Zustand herauszukommen, in dem ich den Buchstaben D von Docker nicht einmal kenne
Versuchen Sie, mit matplotlib aus den Daten von "Schedule-kun" eine Kampfaufzeichnungstabelle zu erstellen.
Als ich versuchte, eine Socket-Kommunikation mit Raspberry Pi durchzuführen, war das Protokoll anders
Es war ein Leben, das ich auf AWS Lambda OCR wollte, um die Charaktere zu lokalisieren.
Ich möchte einen Screenshot der Site in Docker mit einer beliebigen Schriftart erstellen
Was ich getan habe, als ich wütend war, es mit der Option enable-shared einzufügen
Ein Hinweis auf Missverständnisse beim Versuch, das gesamte selbst erstellte Modul mit Python3 zu laden
Eine Geschichte über den Versuch, Linter mitten in einem Python (Flask) -Projekt vorzustellen
[Es war eine Spezifikation von Curl & HTTP] Wenn Flask mit uWSGI von HTTP ausgeführt wird, gibt es beim Posten einer Datei eine saubere Verzögerung von 1 Sekunde.
Ich mag es nicht, mit der Veröffentlichung von Pokemon Go frustriert zu sein, deshalb habe ich ein Skript erstellt, um die Veröffentlichung zu erkennen und zu twittern
Memo mit Python mit HiveServer2 von EMR verbunden
Ich möchte mit einem Knopf am Kolben übergehen
Ein Memo zum visuellen Verstehen der Achse von Pandas.Panel
Python Ver. Einführung in WebPay mit ein wenig Code
Machen Sie LCD-Screenshots mit Python-LEGO Mindstorms
[PyTorch] Ein wenig Verständnis von CrossEntropyLoss mit mathematischen Formeln
Ausgabeprotokoll an die Konsole mit Flask + Nginx auf Docker
Versuchen Sie, den Inhalt von Word mit Golang zu erhalten
Visualisieren Sie das charakteristische Vokabular eines Dokuments mit D3.js.