2017-08-08 2 views
0

Dieser Fehler ist der gleiche mit ECONNREFUSED. Aber die Implementierung ist anders, dann werde ich hier eine andere Frage stellen. Hierdocker-komponieren ECONNREFUSED für Postgres auf nodeJS

ist die docker-compose.yml Datei

version: '3' 

services: 
    server: 
    build: 
     context: . 
    volumes: 
     # Mounts the project directory on the host to /app inside the container, 
     # allowing you to modify the code without having to rebuild the image. 
     - .:/app 
     # Just specify a path and let the Engine create a volume. 
     # Data present in the base image at the specified mount point will be copied 
     # over to the new volume upon volume initialization. 
     # node_modules from this new volume will be used and not from your local dev env. 
     - /app/node_modules/ 

    # Expose ports [HOST:CONTAINER} 
    ports: 
     - "4040:4040" 

    # Set environment variables from this file 
    env_file: 
     - .env 

    # Overwrite any env var defined in .env file (if required) 
    environment: 
     - NODE_ENV=development 

    # Link to containers in another service. 
    # Links also express dependency between services in the same way as depends_on, 
    # so they determine the order of service startup. 
    links: 
     - postgres 
    postgres: 
    image: "postgres:9.6" 
    ports: 
     - "5432:5432" 
    environment: 
     POSTGRES_PASSWORD: 123456 
     POSTGRES_USER: postgres 
     POSTGRES_DB: postgres 

Hier ist die database.json-Datei, die ich verwendet Datenbank zum Speichern von Informationen

{ 
"development": { 
    "username": "postgres", 
    "password": "123456", 
    "database": "mydb", 
    "host": "127.0.0.1", 
    "dialect": "postgres", 
    "pool": { 
     "max": 100, 
     "min": 0, 
     "idle": 10000 
    } 
}, 
"test": { 
    "username": "postgres", 
    "password": "123456", 
    "database": "mytestdb", 
    "host": "127.0.0.1", 
    "dialect": "postgres" 
}, 
"production": { 
    "username": "postgres", 
    "password": "123456", 
    "database": "mydb", 
    "host": "127.0.0.1", 
    "dialect": "postgres" 
} 
} 

Und Sequelize verwenden, um DB zu verbinden

import database from '../../config/database.json' 

const sequelize = new Sequelize(dbConfig.database, dbConfig.username, dbConfig.password, dbConfig) 

Ich weiß, Wenn ich Anwendungen in Containern starte, sind das nicht beide auf locahost muss ich dann host ändern, aber wie kann ich hier ändern. Ich arbeitete um Update host zu postgres. Es funktioniert, aber die Lösung ist nicht das, was ich finden möchte.

Übrigens, wie kann ich hier DB erstellen.

postgres_1 | FATAL: database "starflow" does not exist

+0

Also welche Lösung willst du? Weil "Host" zu "Postgres" wechseln ist der beste Weg –

+0

Muss ich eine neue Umgebung für Docker erstellen?. Ich möchte nur die Entwicklung für den lokalen Server verwenden. –

+0

Docker wird in einer neuen Umgebung ausgeführt. Und Sie müssen diese Umgebung konfigurieren, wenn der Container zum ersten Mal ausgeführt wird. – Ayushya

Antwort

1

Es gibt zwei Dinge, die Sie tun müssen. Einer davon ist, dass Sie Ihre App im Netzwerk der DB verschieben, so dass DB auf dem Host verfügbar ist. Dies erfordert das Hinzufügen eines network_mode zu Ihrem Dienst. Siehe das aktualisierte YAML

version: '3' 

services: 
    server: 
    build: 
     context: . 
    volumes: 
     # Mounts the project directory on the host to /app inside the container, 
     # allowing you to modify the code without having to rebuild the image. 
     - .:/app 
     # Just specify a path and let the Engine create a volume. 
     # Data present in the base image at the specified mount point will be copied 
     # over to the new volume upon volume initialization. 
     # node_modules from this new volume will be used and not from your local dev env. 
     - /app/node_modules/ 

    # Expose ports [HOST:CONTAINER} 
    # ports: 
    # - "4040:4040" 

    network_mode: service:postgres 

    # Set environment variables from this file 
    env_file: 
     - .env 

    # Overwrite any env var defined in .env file (if required) 
    environment: 
     - NODE_ENV=development 

    # Link to containers in another service. 
    # Links also express dependency between services in the same way as depends_on, 
    # so they determine the order of service startup. 
    links: 
     - postgres 
    postgres: 
    image: "postgres:9.6" 
    ports: 
     - "5432:5432" 
     - "4040:4040" 
    environment: 
     POSTGRES_PASSWORD: 123456 
     POSTGRES_USER: postgres 
     POSTGRES_DB: postgres 

Beachten Sie, dass Ports zu dem Dienst verschoben werden, der das Netzwerk bereitstellt. Wir betreiben den server Service auf postgres Netzwerk. Auf diese Weise können beide auf localhost zugreifen und es ist keine Änderung in Ihrer Umgebungskonfiguration erforderlich.

Dies wird nur in Entwicklungs- oder Testumgebungen und nicht in der Produktion empfohlen. Also, wenn Sie Docker Einsatz entwickeln, die in der Produktion eingesetzt werden würden, verwenden Sie diesen Ansatz nicht

Weiter, um das Postgres Bild anpassen eine andere Datenbank folgen Sie der untene Dokumentation des Bildes erstellen

Wie dieses Bild

zu verlängern Wenn Sie von diesem abgeleiteten zusätzlicher Initialisierung in einem Bild tun mögen, fügen Sie eine oder mehr * .sql, * .sql.gz oder * .sh Skripte unter/docker- entrypoint-initdb.d (bei Bedarf das Verzeichnis erstellen). Nachdem der Einstiegspunkt initdb aufgerufen hat, um den Standardbenutzer und die Postgres-Datenbank zu erstellen, werden alle * .sql-Dateien ausgeführt und alle * .sh-Skripte, die in diesem Verzeichnis gefunden wurden, zur weiteren Initialisierung vor dem Start des Dienstes verwendet.

Zum Beispiel einen zusätzlichen Benutzer und Datenbank hinzuzufügen, fügen Sie folgendes /docker-entrypoint-initdb.d/init-user-db.sh:

#!/bin/bash 
set -e 

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL 
    CREATE USER docker; 
    CREATE DATABASE docker; 
    GRANT ALL PRIVILEGES ON DATABASE docker TO docker; 
EOSQL 

Weiteren Informationen finden Sie unter https://hub.docker.com/_/postgres/

0

Ihre host sollte nicht in verschiedenen Umgebungen ändern müssen. Es sollte der Name Ihres pgsql-Dienstes zugewiesen werden, wie in Ihrer docker-compose.yaml definiert, in diesem Fall ist es postgres.

Das heißt, wenn Sie nicht in Ihrem database.json Datei keine umgebungsspezifischen Parameter zu hart Code hoffen haben, können Sie sie in verschiedene database.json Dateien aufgeteilt und erstreckt sich Ihre docker-compose.yml mit zusätzlichen umgebungsspezifischen compose Datei.

Zum Beispiel können Sie teilen Sie Ihre database.json in db-dev.json, db-staging.json und db-prod.json.

Dann definieren Sie umgebungsspezifische Verfassen von Dateien, die die verschiedenen Dateien bereitstellen. Zum Beispiel

# dbconfig-dev.yml 
services: 
    server: 
     volumes:  
     - ./config/db-dev.json:/app/ 

# dbconfig-staging.yml 
services: 
    server: 
     volumes:  
     - ./config/db-staging.json:/app/ 

# dbconfig-prod.yml 
services: 
    server: 
     volumes:  
     - ./config/db-prod.json:/app/ 

Beachten Sie, dass diese Compose-Dateien sind nicht vollständig Compose Definitionen, dass sie nur von den entsprechenden volumes Fragmenten bestehen.

Dann können Sie sich Ihre ursprüngliche docker-compose.yaml, indem Sie:

$ docker-compose -f docker-compose.yaml -f dbconfig-dev.yaml up 

Sie können docs im Compose mehr darüber lesen.

Verwandte Themen