Es war unpraktisch, Docker-Compose zu verwenden, also habe ich es geschafft.
https://github.com/pistatium/dj_database_waiter
Ein Python-Befehl, der nur darauf wartet, dass eine Datenbankverbindung hergestellt wird.
dj_database_waiter myproject.settings
Sie müssen lediglich das Django-Konfigurationsmodul als Argument übergeben. (Streng aufhören)
Wenn DB und Django mit Docker-Compose gestartet werden, wartet Docker darauf, dass der Django-Seitencontainer gestartet wird, bis die minimale Netzwerkkommunikation möglich ist (?), Aber bis zur Initialisierung wie der anfänglichen SQL-Eingabe. Wird nicht fest warten. Es beginnt ohne Erlaubnis und der Container endet ohne Erlaubnis. Hart Selbst wenn Sie die Lösung mit StackOverflow nachschlagen, müssen Sie warten, bis sie mit einem Shell-Skript vorbereitet ist, was ziemlich schmerzhaft ist. Ich möchte den DB-Client nicht auf Pythons Docker installieren, nur um die Kommunikation zu überprüfen ...
Es ist daher besser, ein Skript zu schreiben, um die Kommunikation in Python zu überprüfen. Ich dachte jedoch, es wäre mühsam, das Skript für jedes Projekt zu kopieren und die Verbindungsinformationen getrennt von Django zu übergeben, also machte ich es zu einem Befehl und gab es mit pip ein.
Zuerst habe ich es als Django-Befehl implementiert, damit es von admin.py aufgerufen werden kann, aber ich habe festgestellt, dass der Start des Unterbefehls selbst vor dem Start der Datenbank fehlgeschlagen ist, und habe ihn als normalen Befehl, der weint, neu geschrieben.
docker-compose.yml
version: '3'
services:
web:
build: .
command: python3 myproject/manage.py runserver 0.0.0.0:8000
volumes:
- .:/src
ports:
- 8000:8000
depends_on:
- db
db:
image: mysql
volumes:
- ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
- db-volume:/var/lib/mysql
volumes:
db-volume:
Wenn es beim Hochladen von Docker-Compose wie folgt nicht einmal gestartet wird, installieren Sie dj_database_waiter zur Erstellungszeit.
docker-compose.yml
command: /bin/sh dj_database_waiter myproject.settings && python3 myproject/manage.py runserver 0.0.0.0:8000
Wenn Sie den Befehl wie folgt ersetzen, können Sie ihn einmal starten.
dj_database_waiter
möchte from typing.NamedTuple
verwenden, daher erfordert ** nur ** Python 3.6.1 oder höher. Bitte verstehe es.
dj_database_waiter/cmd.py
class DbStatus(NamedTuple):
ok: bool
reason: str = None
def check_status(db_group_name: str) -> DbStatus:
try:
...
except Exception as e: # NOQA
return DbStatus(ok=False, reason=str(e))
return DbStatus(ok=True)
Da es zwei Argumente gibt, ist es fast nicht erforderlich, NamedTuple zu verwenden, aber es kann auf eine leicht verständliche Weise wie diese geschrieben werden. Es ist ähnlich wie bei CaseClass in Scala. Ich schreibe auch Typinformationen. Wenn ich sie also mit einer IDE wie IntelliJ schreibe, führt sie eine knusprige Interpolation und Fehlerprüfung durch, was für die psychische Gesundheit sehr gut ist. (Der Laufzeittyp wird übrigens nicht überprüft. Selbst wenn Sie den falschen Typ eingeben, funktioniert er.)
Recommended Posts