2016-04-27 9 views
0

Ich habe die Dokumentation von Docker gelesen, aber ich kann kein Bild erstellen, das funktioniert.Docker-Image für NodeJS + PostgreSQL-Webanwendung erstellen

Ich habe eine NodeJS Anwendung, die PostgreSQL als Datenbank verwendet:

var connectionString = process.env.DATABASE_URL || 'postgres://localhost:5432/db'; 
var pg = require('pg'); 
var pgp = require('pg-promise')(); 
var db = pgp(connectionString); 
db.func('some_storedProcedure').then(//...) 
//... 

Ich habe zuerst eine Dockerfile nach Node's documentation für sie:

FROM node:argon 

# Create app directory 
RUN mkdir -p /app 
WORKDIR /app 

# Install app dependencies 
COPY package.json /app 
RUN npm install 

# Bundle app source 
COPY . /app 

EXPOSE 5000 

CMD [ "npm", "start" ] 

Ich folgte dann this post in Bezug auf die Datenbank mit diesem verbunden mit docker-komponieren. die docker-compose.yml Datei wie folgt aussieht:

web: 


build: . 
    ports: 
    - "5000:5000" 
    volumes: 
    - .:/app 
    links: 
    - db 
    environment: 
    DATABASE_URL: postgres://myuser:[email protected]:5432/db 
db: 
    image: postgres 
    environment: 
    POSTGRES_USER: myuser 
    POSTGRES_PASSWORD: mypass 

Dies ist (etwas) von dem, was zurückgegeben wird, wenn ich docker-compose up mit diesen Dateien ausgeführt werden, nachdem das Bild erzeugt wird.

npm info ok 
---> 87dbbae35721 
Removing intermediate container c73f826a0b3d 
Step 6 : COPY . /app 
---> ec56bfc11d3c 
Removing intermediate container 745ddf82d742 
Step 7 : EXPOSE 5000 
---> Running in b2be5aecd9d6 
---> a7d126a7ea5e 
Removing intermediate container b2be5aecd9d6 
Step 8 : CMD npm start 
---> Running in 0379d512c688 
---> 266517f47311 
Removing intermediate container 0379d512c688 
Successfully built 266517f47311 
WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. 
Starting imagename_db_1 
Creating imagename_web_1 
Attaching to imagename_db_1, imagename_web_1 
web_1 | npm info it worked if it ends with ok 
web_1 | npm info using [email protected] 
web_1 | npm info using [email protected] 
web_1 | npm info prestart [email protected] 
web_1 | npm info start [email protected] 
web_1 | 
web_1 | > [email protected] start /app 
web_1 | > node index.js 
web_1 | 
web_1 | Wed, 27 Apr 2016 00:41:19 GMT body-parser deprecated bodyParser: use individual json/urlencoded middlewares at index.js:13:9 
web_1 | Wed, 27 Apr 2016 00:41:19 GMT body-parser deprecated undefined extended: provide extended option at node_modules/body-parser/index.js:105:29 
web_1 | Node app is running on port 5000 
db_1 | LOG: database system was interrupted; last known up at 2016-04-25 00:17:59 UTC 
db_1 | LOG: database system was not properly shut down; automatic recovery in progress 
db_1 | LOG: invalid record length at 0/17076E8 
db_1 | LOG: redo is not required 
db_1 | LOG: MultiXact member wraparound protections are now enabled 
db_1 | LOG: database system is ready to accept connections 
db_1 | LOG: autovacuum launcher started 

Wenn ich http://localhost:5000 zugreifen, sehe ich die Web-Anwendung läuft, aber wenn ich etwas Feuer, die auf die Datenbank zuzugreifen versucht, erhalte ich einen HTTP-500-Fehler mit dem folgenden Körper

code: "28P01" 
file: "auth.c" 
length: 98 
line: "285" 
name: "error" 
routine: "auth_failed" 
severity: "FATAL" 

Was mache ich falsch? Ich bin mir nicht sicher, ob ich verstehe, was ich mit Docker mache, und das Einzige, was ich zur Dokumentation habe, sind einfache Rezepte, um bestimmte Umgebungen zu erstellen (oder zumindest habe ich das verstanden)

Danke.

+0

Der Fehler besagt, dass Ihre Authentifizierungsdetails für den Datenbankserver fehlgeschlagen sind. Können Sie sich überhaupt erfolgreich mit Ihrer App verbinden? Sie können dies überprüfen: http://stackoverflow.com/questions/36120435/verify-database-connection-with-pg-promise-when-starting-an-app. Und wenn kein Glück, können Sie dies versuchen: http://stackoverflow.com/questions/35807792/how-do-you-connect-to-a-postgres-database-with-no-password-using-pg-promise. Außerdem müssen Sie 'pg' nicht einschließen, wenn Sie bereits' pg-promise' erhalten haben;) –

+0

@vitaly: Wenn ich meine Anwendung in meinem Host-System laufe, habe ich keine Probleme beim Verbinden überhaupt. Es führt die App durch das Bild, das dieses Problem verursacht – Heathcliff

+0

Wahrscheinlich ein Problem mit der Docker-Konfiguration. Sie haben den Datenbankport nicht angegeben und möglicherweise sind Ihr Benutzername oder Ihr Passwort falsch. –

Antwort

0

Überprüfen Sie Ihre pg_hba.conf in $ PGDATA ermöglicht Verbindungen von node.js.

Standardmäßig ist die pg_hba.conf etwa so:

# TYPE DATABASE  USER   ADDRESS     METHOD 

# "local" is for Unix domain socket connections only 
local all    all          trust 
# IPv4 local connections: 
host all    all    127.0.0.1/32   trust 
# IPv6 local connections: 
host all    all    ::1/128     trust 

Diese für Ihre Standard psql-Konnektivität über die OS Besitzer ist in Ordnung, da es lokale Verbindungen vertraut für localhost IP-Adresse 127.0.0.1 ermöglicht. Wenn Sie jedoch eine IP-Adresse auf dem Server festgelegt haben, müssen Sie, wie ich vermute, einen Eintrag zulassen, da Sie in Ihrer node.js-Konfiguration auf einen Host "DB" verweisen. So ping „DB“ und fügen Sie diese IP-Adresse:

# TYPE DATABASE  USER   ADDRESS     METHOD 

# "local" is for Unix domain socket connections only 
local all    all          trust 
# IPv4 local connections: 
host all    all    127.0.0.1/32   trust 
# IPv6 local connections: 
host all    all    ::1/128     trust 
host db    myuser   <ip-for-db-host>  md5 

Sobald Sie diese Datei geändert haben müssen Sie einen pg_ctl Reload durchführen.

+0

Wie kann ich das im Bild überprüfen? Ist die Konfigurationsdatei im selben Pfad, als ich es bei der Installation von PostgreSQL in Ubuntu finden kann? – Heathcliff

+0

yeah pg_hba.conf befindet sich immer im Datenverzeichnis, nachdem Sie eine Instanz mit initdb erstellt haben. Standardmäßig wird es wahrscheinlich irgendwo /var/lib/pgsql-9.5/data sein, wenn Sie es nicht explizit angeben, wo es installiert werden soll. – d1ll1nger