1
votes

Mauvaise configuration de la base de données dans seetings.py ou docker

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,
    }
}


2 commentaires

Comment se fait-il que docker-compose up fonctionne alors que python 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?


3 Réponses :


0
votes

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:

  1. La base de données de votre conteneur Docker est en panne. Essayez d'exécuter docker-compose up -d db
  2. Vous utilisez Windows comme système hôte. Sous Windows, il n'y a pas d'accès aux conteneurs depuis l'hôte, vous devez installer postgres localement.
  3. Vous avez des problèmes de réseau. Essayez 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?


4 commentaires

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é



1
votes

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.

/settings/local.py

from .base import *

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'localhost',
        'PORT': 5432,
    }
}

/settings/deploy.py

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 .settings.local.


5 commentaires

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



1
votes

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}


0 commentaires