10
votes

Django docker - impossible de traduire le nom d'hôte "db" en adresse: nom de noeud ou nom de service fourni, ou inconnu

Je suis relativement nouveau sur Django et Docker et je suis un tutoriel pour créer une mini application. Cependant, je suis bloqué avec l'erreur suivante:

django.db.utils.OperationalError: could not translate host name "db" to address: nodename nor servname provided, or not known

Mon fichier docker-compose se présente comme suit:

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

Mon fichier settings.py contient la base de données:

 version: '3'
 services:
  db:
     image: 'postgres'
     ports:
       - '5432'
  core:
    build:
      context: .
      dockerfile: Dockerfile
    command: python3 manage.py runserver 0.0.0.0:8000
    ports:
      - '8000:8000'
    volumes:
      - .:/code
    depends_on:
      - db
    links:
      - db:db

J'ai vu le message ici et ici, mais les deux n'ont pas résolu le problème.

J'apprécierais quelques conseils. Merci.


8 commentaires

Pouvez-vous garder le conteneur postgres en cours d'exécution et redémarrer uniquement le conteneur django et me dire si vous obtenez toujours la même erreur?


Merci pour votre commentaire Mostafa. Désolé, je suis encore assez nouveau dans Docker, donc j'ai peut-être besoin d'un coup de main pour le faire. J'ai arrêté docker. Comment puis-je simplement faire fonctionner le conteneur Postgres? Merci.


docker-compose restart core cela redémarrera l'application sans la base de données donc assurez-vous que la base de données est en cours d'exécution puis exécutez la commande


Merci. J'ai toujours le problème malheureusement.


Êtes-vous sûr que le conteneur postgres était opérationnel et qu'il n'a pas redémarré pendant que vous redémarriez l'application? pouvez-vous vérifier le temps de fonctionnement via docker ps ?


Voir la disponibilité: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 189666f6a2b7 vision_core "python3 manage.py r…" 4 minutes ago Up 3 minutes 0.0.0.0:8000->8000/tcp vision_core_1 af5402d6495f postgres "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 0.0.0.0:32769->5432/tcp vision_db_1


Continuonscette discussion en chat .


Sûr. Merci de votre aide :)


7 Réponses :


4
votes

Vous essayez donc d'atteindre la base de données qui s'exécute dans un conteneur à partir d'un autre conteneur? Si oui - ce qui suit pourrait potentiellement aider, au moins cela m'a aidé lorsque j'avais des problèmes similaires.

Essayez de définir la configuration des réseaux en plus des liens dans votre fichier de composition, créez un réseau avec un nom et définissez-le dans les deux services. Comme décrit ici , car les docks sur la configuration des liens recommandent de le faire.

Quelque chose comme ça pour votre cas:

version: '3'
 services:
  db:
     image: 'postgres'
     ports:
       - '5432'
     networks:
      some_network:
  core:
    build:
      context: .
      dockerfile: Dockerfile
    command: python3 manage.py runserver 0.0.0.0:8000
    ports:
      - '8000:8000'
    volumes:
      - .:/code
    depends_on:
      - db
    links:
      - db:db
    networks:
      some_network:
  networks:
   some_network:

Cela m'a aidé à résoudre le nom d'hôte pour me connecter à la base de données.


0 commentaires

2
votes

J'ai dû utiliser docker-compose up pour m'assurer que mon conteneur de db fonctionnait.


0 commentaires

1
votes

Je suis tombé sur ce problème récemment, je l'ai résolu en ajoutant des variables d'environnement postgres à db dans mon fichier docker-compose.yml comme ceci

version: '3'
 services:
  db:
     image: 'postgres'
     ports:
       - '5432'
     environment:
            - POSTGRES_DB=booksdb
            - POSTGRES_USER=postgres
            - POSTGRES_PASSWORD=postgres
  core:
    build:
      context: .
      dockerfile: Dockerfile
    command: python3 manage.py runserver 0.0.0.0:8000
    ports:
      - '8000:8000'
    volumes:
      - .:/code
    depends_on:
      - db
    links:
      - db:db


0 commentaires

1
votes

Je cherche depuis plusieurs jours la solution à ce problème. Voici ce que j'ai fait:

1 - J'ai copié le fichier postgresql.conf.sample de mon conteneur postgres dans mon dossier de projet, vous devez accéder à cd usr/share/postgresql avec docker exec -it yourcontainer bash

2 - J'ai changé son nom en postgresql.conf

3 - J'ai modifié ces variables dans postgresql.conf

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

4 - Je l'ai ajouté à mon Dockerfile

COPY postgresql.conf      /tmp/postgresql.conf

5 - settings.py

    listen_addresses = '*'
    port = 5432             
    max_connections = 100           
    superuser_reserved_connections = 3
    unix_socket_directories = '/tmp'

6 - J'ai fait à nouveau docker-compose up -build


0 commentaires

0
votes

Dans mon cas spécifique, j'avais postgres sans aucune version, donc l'image postgres est mise à jour et le conteneur db (postgres) ne se lève pas


0 commentaires

1
votes

Au lieu de redéfinir les réseaux, utilisez

docker-compose up

pour arrêter tous les conteneurs et supprimer toutes les données mises en cache.

ensuite

docker-compose down -v

pour redémarrer à partir de zéro .


0 commentaires

0
votes

La configuration suivante fonctionne pour moi à partir de la documentation officielle

docker-compose logs    

puis exécutez ces commandes:

docker-compose up -d --build   
version: "3.8"

services:
  db:
    image: postgres
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres

  web:
    build: .
    command: python /code/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db


0 commentaires