Je construis une application fonctionnant sur NodeJS en utilisant postgresql . J'utilise SequelizeJS en tant qu'ORM . Pour éviter d'utiliser de vrais démons postgres et d'avoir des nœuds sur mon propre appareil, j'utilise des conteneurs avec docker-compose.
quand je lance docker-compose up
it démarre la base de données pg
database system is ready to accept connections
et le serveur nodejs . mais le serveur ne peut pas se connecter à la base de données.
Error: connect ECONNREFUSED 127.0.01:5432
Si j'essaye de faire tourner le serveur sans utiliser de conteneurs (avec de vrais noeuds et postgresd sur ma machine), ça marche.
Mais je veux que cela fonctionne correctement avec les conteneurs. Je ne comprends pas ce que je fais mal.
voici le fichier docker-compose.yml
web:
image: node
command: npm start
ports:
- "8000:4242"
links:
- db
working_dir: /src
environment:
SEQ_DB: mydatabase
SEQ_USER: username
SEQ_PW: pgpassword
PORT: 4242
DATABASE_URL: postgres://username:[email protected]:5432/mydatabase
volumes:
- ./:/src
db:
image: postgres
ports:
- "5432:5432"
environment:
POSTGRES_USER: username
POSTGRES_PASSWORD: pgpassword
Quelqu'un peut-il m'aider, s'il vous plaît?
(Quelqu'un qui aime docker :))
Votre DATABASE_URL
fait référence à 127.0.0.1
, qui est l'adaptateur de bouclage (plus ici ). Cela signifie "se connecter à moi-même".
Lorsque vous exécutez les deux applications (sans utiliser Docker) sur le même hôte, elles sont toutes deux adressables sur le même adaptateur (également appelé localhost
).
Lorsque vous exécutez les deux applications dans des conteneurs, elles ne sont pas toutes les deux sur localhost, comme auparavant. Au lieu de cela, vous devez faire pointer le conteneur web
vers l'adresse IP du conteneur db
sur l'adaptateur docker0
- que docker-compose
définit pour vous.
Changement:
DATABASE_URL: postgres://username:[email protected]:5432/mydatabase
à
DATABASE_URL: postgres://username:pgpassword@db:5432/mydatabase
Cela fonctionne grâce aux liens Docker: le conteneur web
a un fichier (/etc/hosts
) avec une entrée db
pointant vers l’adresse IP où se trouve le conteneur db
. Il s’agit du premier endroit où un système (dans ce cas, le conteneur) examinera les tentatives de résolution des noms d’hôte.
Si vous envoyez des vars de base de données séparément. Vous pouvez affecter un hôte de base de données.
DB_Host=<POSTGRES_SERVICE_NAME> #in your case "db" from docker-compose file.