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