J'essaie de me connecter à postgres en cours d'exécution localement via un script python qui s'exécute dans un conteneur. Je le configure comme ceci car à l'avenir, une fois que je déploierai, j'utiliserai un service de base de données géré qui fait tourner postgres.
Idéalement, je suis capable de définir une URL postgres dans le .env , docker-compose utilise l'environnement pour définir les variables d'environnement et l'application lit l'url postgres.
Est-ce la meilleure approche ou si je devrais avoir un conteneur postgres?
Meilleure approche pour atteindre le flux que je viens de décrire.
J'ai essayé de passer POSTGRES_URL dans le .env en utilisant localhost, public ip, local ip. Par exemple: postgresql: // username: password @ localhost: 5432 / dbname
version: "3.7"
services:
app:
build:
context: ./
dockerfile: Dockerfile
volumes:
- "./:/usr/src/app"
environment:
- ENV=${ENV}
- LOGS=${LOGS}
- AWS_REGION=${AWS_REGION}
- AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
- AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
- POSTGRES_URL=${POSTGRES_URL}
Attendu: connexion à la base de données locale réussie.
Réel: Le serveur s'exécute-t-il sur l'hôte et accepte-t-il Connexions TCP / IP sur le port 5432?
3 Réponses :
localhost dans le conteneur signifie le conteneur lui-même, pas l'hôte du docker. Si vous visitez postgres en utilisant localhost , il essaiera de trouver le service dans le conteneur, mais le conteneur n'avait en fait pas de service db. Vous devez définir l'adresse IP de l'hôte du docker pour les postgres locaux.
Par exemple. si l'adresse IP de votre hôte docker est 10.192.225.111 , alors POSTGRES_URL dans .env doit être:
postgresql://username:password@10.192.225.111:5432/dbname
J'utiliserais un conteneur postgres dans docker-compose comme ceci:
db:
image: postgres:11.4
ports:
# In order to connect to the database from the host
- "5432:5432"
environment:
- POSTGRES_PASSWORD=pw
- POSTGRES_USER=user
Dans cet exemple, vous rempliriez un nom d'utilisateur et un mot de passe pour démarrer votre conteneur.
Une fois que vous l'avez dans votre fichier docker-compose.yml , votre conteneur d'application pourra accéder au conteneur de base de données via le nom du service. Dans cet exemple, ce serait db . Ainsi, votre chaîne de connexion serait postgresql://user:pw@db:5432/dbname
Ok, donc j'utilise un mac comme machine de développement, j'aurais dû le mentionner, pour les personnes aux prises avec le même problème. L'adresse IP de l'hôte docker de mac change constamment.
Modification de mon URL postgres .env en:
postgresql: // nom d'utilisateur: password@docker.for.mac.localhost: 5432 / dbname
semble faire l'affaire.