2016-05-27 7 views
-1

Ich verwende jetzt docker-compose für alle meine Projekte. Sehr angenehm. Viel komfortabler als manuelle Verknüpfung über mehrere docker Befehle.Docker-komponieren: Verständnis Verknüpfung von Umgebungsvariablen

Da ist etwas, das mir noch nicht klar ist: die Logik hinter den verknüpfenden Umgebungsvariablen.

Eg. mit diesem docker-compose.yml:

mongodb: 
    image: mongo 
    command: "--smallfiles --logpath=/dev/null" 
web: 
    build: . 
    command: npm start 
    volumes: 
    - .:/myapp 
    ports: 
    - "3001:3000" 
    links: 
    - mongodb 
    environment: 
    PORT: 3000 
    NODE_ENV: 'development' 

Im Knoten App, brauche ich die mongodb URL abgerufen werden. Und wenn ich console.log(process.env), ich so viele Dinge, dass es sehr zufällig fühlt (gehalten nur die docker-compose -related sind):

MONGODB_PORT_27017_TCP: 'tcp://172.17.0.2:27017', 
MYAPP_MONGODB_1_PORT_27017_TCP_PORT: '27017', 
MYAPP_MONGODB_1_PORT_27017_TCP_PROTO: 'tcp', 
MONGODB_ENV_MONGO_VERSION: '3.2.6', 
MONGODB_1_ENV_GOSU_VERSION: '1.7', 
'MYAPP_MONGODB_1_ENV_affinity:container': '=d5c9ebd7766dc954c412accec5ae334bfbe836c0ad0f430929c28d4cda1bcc0e', 
MYAPP_MONGODB_1_ENV_GPG_KEYS: 'DFFA3DCF326E302C4787673A01C4E7FAAAB2461C \t42F3E95A2C4F08279C4960ADD68FA50FEA312927', 
MYAPP_MONGODB_1_PORT_27017_TCP: 'tcp://172.17.0.2:27017', 
MONGODB_1_PORT: 'tcp://172.17.0.2:27017', 
MYAPP_MONGODB_1_ENV_MONGO_VERSION: '3.2.6', 
MONGODB_1_ENV_MONGO_MAJOR: '3.2', 
MONGODB_ENV_GOSU_VERSION: '1.7', 
MONGODB_1_PORT_27017_TCP_ADDR: '172.17.0.2', 
MONGODB_1_NAME: '/myapp_web_1/mongodb_1', 
MONGODB_1_PORT_27017_TCP_PORT: '27017', 
MONGODB_1_PORT_27017_TCP_PROTO: 'tcp', 
'MONGODB_1_ENV_affinity:container': '=d5c9ebd7766dc954c412accec5ae334bfbe836c0ad0f430929c28d4cda1bcc0e', 
MONGODB_PORT: 'tcp://172.17.0.2:27017', 
MONGODB_1_ENV_GPG_KEYS: 'DFFA3DCF326E302C4787673A01C4E7FAAAB2461C \t42F3E95A2C4F08279C4960ADD68FA50FEA312927', 
MYAPP_MONGODB_1_ENV_GOSU_VERSION: '1.7', 
MONGODB_ENV_MONGO_MAJOR: '3.2', 
MONGODB_PORT_27017_TCP_ADDR: '172.17.0.2', 
MONGODB_NAME: '/myapp_web_1/mongodb', 
MONGODB_1_PORT_27017_TCP: 'tcp://172.17.0.2:27017', 
MONGODB_PORT_27017_TCP_PORT: '27017', 
MONGODB_1_ENV_MONGO_VERSION: '3.2.6', 
MONGODB_PORT_27017_TCP_PROTO: 'tcp', 
MYAPP_MONGODB_1_PORT: 'tcp://172.17.0.2:27017', 
'MONGODB_ENV_affinity:container': '=d5c9ebd7766dc954c412accec5ae334bfbe836c0ad0f430929c28d4cda1bcc0e', 
MYAPP_MONGODB_1_ENV_MONGO_MAJOR: '3.2', 
MONGODB_ENV_GPG_KEYS: 'DFFA3DCF326E302C4787673A01C4E7FAAAB2461C \t42F3E95A2C4F08279C4960ADD68FA50FEA312927', 
MYAPP_MONGODB_1_PORT_27017_TCP_ADDR: '172.17.0.2', 
MYAPP_MONGODB_1_NAME: '/myapp_web_1/novatube_mongodb_1', 

Sie wissen nicht, was zu holen, und warum so viele Einträge? Ist es besser, die allgemeinen oder die MYAPP -Vorzugsweise zu verwenden? Woher kommt der Name MYAPP? Ordnernamen?

Könnte jemand das klären?

Wäre es nicht einfacher, den Benutzer die benötigten Dateien in der Datei docker-compose.yml mit einer benutzerdefinierten Zuordnung definieren zu lassen? Wie:

links: 
    - mongodb: 
     - MONGOIP: IP 
     - MONGOPORT : PORT 

Was ich sagen will könnte allerdings nicht haben Sinn. :-)

Antwort

1

Umgebungsvariablen sind eine traditionelle Art, Verbindungen zwischen Containern zu definieren. Wenn Sie eine neuere Version von Compose verwenden, benötigen Sie die links Deklaration überhaupt nicht. Der Versuch, eine Verbindung zu mongodb über Ihren App-Container herzustellen, funktioniert problemlos, indem Sie einfach den Namen des Dienstes (mongodb) als Hostnamen verwenden, ohne die in der Compose-Datei definierten Links (statt der integrierten DNS-Auflösung von docker verwenden Sie/etc/hosts) dort entweder!)

In Antwort auf Ihre Frage darüber, warum das Präfix mit MYAPP, haben Sie Recht. Compose fügt dem Dienstnamen den Namen des Ordners (oder "Projekt" in der Nomenklatur) voran. Dasselbe gilt für das Erstellen von benutzerdefinierten Netzwerken und Volumes.

+1

Danke für all diese Klarstellungen. Wenn ich das richtig verstehe, heißt das im 'MYAPP'-Container, dass ich den Mongo mit etwas wie 'mongo.connect (' http: // mongodb ')' anrufe? –

+0

Yup! Das ist richtig :) – johnharris85

+0

Das klingt großartig! :-) –