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