Il n'était pas pratique d'utiliser Docker-compose, alors je l'ai fait.
https://github.com/pistatium/dj_database_waiter
Une commande Python qui attend juste qu'une connexion à la base de données soit établie.
dj_database_waiter myproject.settings
Tout ce que vous avez à faire est de passer le module de configuration Django en argument. (Arrêtez strictement)
Lorsque DB et Django sont démarrés avec docker-compose, Docker attend que le conteneur côté Django démarre jusqu'à ce que la communication réseau minimale soit possible (?), Mais jusqu'à l'initialisation telle que l'entrée SQL initiale. N'attendra pas fermement. Il démarre sans autorisation et le conteneur se termine sans autorisation. Dur Même si vous recherchez la solution avec StackOverflow, il est écrit que vous devez attendre qu'elle soit préparée avec un script shell, ce qui est assez pénible. Je ne veux pas installer le client DB sur le Docker de Python juste pour vérifier la communication ...
Il est donc préférable d'écrire un script pour vérifier la communication en Python. Cependant, j'ai pensé qu'il serait gênant de copier le script pour chaque projet et de transmettre les informations de connexion séparément de Django, alors je l'ai transformé en commande et l'ai entré avec pip.
Au début, je l'ai implémentée en tant que commande Django afin qu'elle puisse être appelée depuis admin.py, mais j'ai remarqué que le démarrage de la sous-commande lui-même échouait avant le démarrage de la base de données et je l'ai réécrit comme une commande normale qui crie.
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:
S'il ne démarre pas une fois lorsque vous téléchargez docker-compose comme celui-ci, installez dj_database_waiter au moment de la construction.
docker-compose.yml
command: /bin/sh dj_database_waiter myproject.settings && python3 myproject/manage.py runserver 0.0.0.0:8000
Si vous remplacez une commande comme celle-ci, vous pourrez la démarrer une fois.
dj_database_waiter
veut utiliser à partir de la saisie.NamedTuple
, donc ** seulement ** nécessite Python 3.6.1 ou supérieur. Veuillez le comprendre.
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)
Puisqu'il y a deux arguments, il n'est presque pas nécessaire d'utiliser NamedTuple, mais il peut être écrit d'une manière facile à comprendre comme celle-ci. C'est similaire à CaseClass dans Scala. J'écris également des informations de type, donc si je les écris en utilisant un IDE comme IntelliJ, il effectuera une interpolation croustillante et une vérification des erreurs, ce qui est très bon pour la santé mentale. (En passant, le type d'exécution n'est pas vérifié, donc même si vous entrez le mauvais type, cela fonctionnera.)