J'apprends à travailler avec Compose + Django en utilisant ce manuel https: // docs. docker.com/compose/django/
Voici mes fichiers de configuration
docker-compose.yml
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres', 'USER': 'postgres', 'HOST': 'db', 'PORT': 5432, } }
3 Réponses :
Je suppose que vous essayez d'exécuter manage.py runserver sur la machine hôte. Une erreur signifie que vous n'avez pas accès à l'hôte 'db' à partir de celui-ci (essayez ping db dans la console). Il y a plusieurs causes à cela:
docker-compose up -d db
ping 127.0.0.11
(c'est le serveur DNS de docker) P.S. Voulez-vous vraiment que Django local utilise Postgres dans un conteneur?
J'ai exécuté la commande depuis 1
, mais cela n'aide pas. Linux et bon ping
Le conteneur 'db' est-il en cours d'exécution? docker ps
Depuis docker compose, il peut être appelé 'docker_db_1', si c'est le cas, vous devez utiliser DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres ',' USER ':' postgres ',' HOST ':' docker_db_1 ',' PORT ': 5432,}}
dans settings.py
Ou utilisez 'hostname' comme Yongjin Jo l'a mentionné
Vous avez oublié de définir hostname
dans le service db
.
from .base import * DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres', 'USER': 'postgres', 'HOST': 'db', 'PORT': 5432, } }
Conseil: n'utilisez pas runserver
lorsque vous déployez un serveur de production. Consultez ce document
La solution est décrit dans les commentaires
Modifier)
exemple de paramètres séparés. Définissez votre settings.py
d'origine dans base.py
dans le dossier settings.
from .base import * DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres', 'USER': 'postgres', 'HOST': 'localhost', 'PORT': 5432, } }
version: '3' services: db: image: postgres hostname: db web: build: . command: python3 manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000" depends_on: - db
Alors enfin, votre dossier de paramètres contient trois fichiers python. base.py
, local.py
, deploy.py
Et lorsque vous exécutez le serveur avec des paramètres locaux, python manage.py runserver --settings
.
@Headmaster Attendez, vous appelez runserver
dans votre local? Vous ne pouvez pas exécuter dans votre local car votre base de données est dans le docker. Vous ne pouvez pas connecter le conteneur par hostname
en dehors du docker.
Merci pour l'explication
Et quelle est la meilleure pratique de cette manière. Avez-vous des paramètres différents pour le docker et pour le local?
Vous devez également publier le port 5432 sur l'hôte
La définition d'un nom d'hôte identique au nom du service est redondante.
C'est un problème courant dans la configuration de docker / django, le conteneur postgres est initialisé mais le moteur n'est pas encore prêt. Vous devez attendre que le serveur postgresql démarre avant d'exécuter le conteneur Web.
Vous pouvez le faire de plusieurs manières, jetez un œil à dockerize
dockerize -timeout=20s -wait ${POSTGRES_PORT}
Comment se fait-il que
docker-compose up
fonctionne alors quepython manage.py runserver
ne fonctionne pas? les premiers exécutent cette commande aussi. êtes-vous sûr que le conteneur Web démarre normalement? Où avez-vous exécuté la commande manuellement?@Siyu - devinez, le problème est que j'exécute
python manage.py runserver
depuis mon local. Peut-être que vous pouvez conseiller, comment utiliser les paramètres à la fois pour le docker et le développement local?