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.
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;) –
@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
Wahrscheinlich ein Problem mit der Docker-Konfiguration. Sie haben den Datenbankport nicht angegeben und möglicherweise sind Ihr Benutzername oder Ihr Passwort falsch. –