2016-09-07 2 views
3

Ich verwende Segel 0.12.3 und Mongo 3.2.7Wie eine authentifizierte Mongo Datenbank in einem Mongo Behälter mit minimalem Konfigurations

Hier ist meine config/connections.js erstellen.

mongo: { 
adapter: 'sails-mongo', 
host: 'database', 
port: 27017, 
user: 'user', //optional 
password: 'password', //optional 
database: 'db' //optional 
} 

und meine Docker-compose.yml

version: '2' 
services: 
    myservice: 
    //blabla 
    links: 
    - database 
    database: 
    image: 'mongo:latest' 
    container_name: 'database' 
    environment: 
     MONGODB_PASSWORD: "password" 
     MONGODB_USER: "user" 
     MONGODB_DATABASE: "db" 

Das Problem kommt, wenn ich die Behälter mit Docker-komponieren bis --build bauen, kommt der Fehler aus dem sails-mongo Modul.

error: A hook (`orm`) failed to load! 
error: Error: Failed to connect to MongoDB. Are you sure your configured Mongo instance is running? 
Error details: 
{ MongoError: Authentication failed. 
at Function.MongoError.create (/app/node_modules/mongodb-core/lib/error.js:31:11) 
at commandCallback (/app/node_modules/mongodb-core/lib/topologies/server.js:929:66) 
at Callbacks.emit (/app/node_modules/mongodb-core/lib/topologies/server.js:116:3) 
at .messageHandler (/app/node_modules/mongodb-core/lib/topologies/server.js:282:23) 
at Socket.<anonymous> (/app/node_modules/mongodb-core/lib/connection/connection.js:273:22) 
at emitOne (events.js:96:13) 
at Socket.emit (events.js:188:7) 
at readableAddChunk (_stream_readable.js:172:18) 
at Socket.Readable.push (_stream_readable.js:130:10) 
at TCP.onread (net.js:542:20) 
name: 'MongoError', 
message: 'Authentication failed.', 
ok: 0, 
code: 18, 
errmsg: 'Authentication failed.' } 

Gibt es eine zusätzliche Konfiguration, die ich brauche, um nur die Container zu starten? Ich verstehe, dass Mongo keine Datenbank erstellt, es sei denn, es gibt einige Daten zu speichern, aber ich bin mir nicht sicher, ob dies überhaupt verwandt ist.

Antwort

4

Lassen Sie uns zuerst Ihr Problem angehen: Authentication failed. Segel-Mongo kann nicht mit Mongodb verbinden. Warum das? Ich sehe, dass Sie einige Umgebungsvariablen an den mongodb Docker Behälter vorgesehen:

environment: 
    MONGODB_PASSWORD: "password" 
    MONGODB_USER: "user" 
    MONGODB_DATABASE: "db" 

aber dies ist nicht dokumentiert in https://hub.docker.com/_/mongo/. Der mongodb-Container ignoriert diese Werte, daher ist keine Authentifizierung konfiguriert. sails-mongo wird versuchen, sich zu authentifizieren, dies schlägt jedoch fehl, da kein solcher Benutzer existiert. Sie können es testen, indem Sie einfach Benutzer und Passwort in config/connections.js auskommentieren. Ihr Dienst kann eine Verbindung herstellen.

In https://hub.docker.com/_/mongo/ wird dokumentiert, wie Sie die Authentifizierung aktivieren:

docker run --name some-mongo -d mongo --auth 

Hinzufügen von Benutzer:

$ docker exec -it some-mongo mongo admin 
connecting to: admin 
> db.createUser({ user: 'jsmith', pwd: 'some-initial-password', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] }); 
Successfully added user: { 
    "user" : "jsmith", 
    "roles" : [ 
     { 
      "role" : "userAdminAnyDatabase", 
      "db" : "admin" 
     } 
    ] 
} 

Um dies zu automatisieren Sie die Erstellung eines Benutzers in einem Shell-Skript setzen könnte und lösen es in Docker compose .


Es gibt eine andere Lösung, die Sie anwenden können. Fragen Sie sich zuerst, warum Sie überhaupt eine Authentifizierung benötigen? Möchtest du von jeder IP Adresse auf die mongodb Instanz zugreifen? Dann brauchen Sie Authentifizierung. Wenn nicht, können Sie die Authentifizierung deaktiviert lassen. Wenn mongodb an localhost bindet, kann niemand außerhalb von localhost eine Verbindung zu ihm herstellen.

Mit dem Andockfenster können Sie das noch weiter aushärten: Jeder Zugriff auf die mongodb Instanz ist verboten. Nur Container, die sich im selben Netzwerk wie mongodb befinden, können eine Verbindung herstellen.

Mit Docker-compose Version 2 Netzwerk-Feature:

version: "2" 

services: 

    my-app: 
    image: myHubRepo/my-app:v1.X.Y 
    container_name: my-app 
    environment: 
     - MONGODB=mongodb:27017 
     - APP_PORT=80 
     - STAGE=production 
    expose: 
     - "80" 
    networks: 
     - back-tier 
    restart: always 

    mongodb: 
    image: mongo 
    volumes: 
     - mongodb-data:/data/db 
    networks: 
     - back-tier 
    restart: always 

volumes: 
    mongodb-data: 
    driver: local 

networks: 
    back-tier: 

MongoDB von außerhalb seines eigenen Behälters trotz von Containern nicht zugänglich sind, die back-tier im selben Netzwerk befinden.

einstellen env/production.js entsprechend:

module.exports = { 
    connections: { 
     prodMongoDb: { 
      adapter: 'sails-mongo', 
      url: 'mongodb://' + process.env.MONGODB + '/my_app' 
     } 
    }, 
    models: { 
     connection: 'prodMongoDb' 
    }, 
    port: process.env.APP_PORT || 8080, 
    log: { 
     level: "warn" 
    } 
}; 

Weitere Informationen über Netzwerke mit compose: https://docs.docker.com/compose/networking/

+0

Sie sehr viel für die vollständige Antwort danken. – Sebastialonso