web-dev-qa-db-fra.com

Impossible de traduire le nom d'hôte "db" en adresse à l'aide de Postgres, Docker Compose et Psycopg2

Dans un dossier, j'ai 3 fichiers: base.py, Dockerfile et docker-compose.yml.

base.py:

import psycopg2

conn = psycopg2.connect("dbname='base123' user='postgres' Host='db' password='pw1234'")

Dockerfile:

FROM ubuntu:16.04

RUN apt-get update
RUN apt-get -y install python-pip
RUN apt-get update
RUN pip install --upgrade pip
RUN pip install psycopg2-binary

COPY base.py base.py

RUN python base.py

docker-compose.yml:

version: '3'
services:
  db:
    image: 'postgres:latest'
    expose:
      - "5432"
    environment:
      POSTGRES_PASSWORD: pw1234
      POSTGRES_DB: base123
  aprrka:
    build: .    
    depends_on:
      - db

Après avoir couru docker-compose up, J'ai eu l'erreur suivante:

Traceback (most recent call last):
  File "base.py", line 5, in <module>
conn = psycopg2.connect("dbname='base123' user='postgres' Host='db' password='pw1234'")
   File "/usr/local/lib/python2.7/dist-packages/psycopg2/__init__.py", line 130, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not translate Host name "db" to address: Name or service not known

ERROR: Service 'aprrka' failed to build: The command '/bin/sh -c python base.py' returned a non-zero code: 1

Je ne sais pas pourquoi j'ai cette erreur. J'ai exposé le port 5432. Par défaut, Compose configure un réseau unique pour l'application. Chaque service rejoint le réseau par défaut, je pense que mon application avec postgres devrait fonctionner ensemble. Ai-je écrit un docker-compose.yml incorrect?

7
gongarek

Le problème est que vous ne devez pas exécuter python base.py dans le cadre de la directive RUN.

La directive RUN n'est exécutée que lorsque vous créez l'image. Le conteneur postgres ne fonctionne pas à ce stade et le réseau n'a pas été créé. Au lieu de cela, vous souhaitez utiliser la directive CMD.

Changez le Dockerfile en ceci:

FROM ubuntu:16.04

RUN apt-get update
RUN apt-get -y install python-pip
RUN apt-get update
RUN pip install --upgrade pip
RUN pip install psycopg2-binary

COPY base.py base.py

CMD ["python", "base.py"]

Ce qui précède devrait entraîner la résolution du nom d'hôte db. Cependant, si votre code python n'a pas de logique de reconnexion pour se connecter à la base de données, le conteneur sera probablement toujours en erreur. Cela parce que le conteneur postgres sera en cours d'exécution mais la base de données ne sera pas prêt à accepter les connexions.

Cela peut être temporairement résolu en ajoutant restart: always à ton docker-compose.yml.

version: '3'
services:
  db:
    image: 'postgres:latest'
    expose:
      - "5432"
    environment:
      POSTGRES_PASSWORD: pw1234
      POSTGRES_DB: base123
  aprrka:
    restart: always
    build: .    
    depends_on:
      - db

J'espère que cela vous permettra de devenir opérationnel.

7
Jack Gore