2016-05-02 6 views
0

Ich versuche zu verwenden Docker-komponieren zum Ausführen mehrerer Dienste (Redis, Mongo und Express-App). Ich möchte, dass mein Host mit dem Container "verbunden" wird, so dass beim Ändern von Dateien auch Dateien im Container geändert werden.Docker - Probleme bei der Freigabe Volume-Host: Container

Die Express-App hat ihre Dockerfile, die npm install ausführen.

Wenn ich versuche, docker-compose up, Im den folgenden Fehler erhalten:

web_1 | [nodemon] 1.9.2 
web_1 | [nodemon] to restart at any time, enter `rs` 
web_1 | [nodemon] watching: *.* 
web_1 | [nodemon] starting `node server/app.js` 
web_1 | module.js:328 
web_1 |  throw err; 
web_1 | ^
web_1 | 
web_1 | Error: Cannot find module 'express' 
web_1 |  at Function.Module._resolveFilename (module.js:326:15) 
web_1 |  at Function.Module._load (module.js:277:25) 
web_1 |  at Module.require (module.js:354:17) 
web_1 |  at require (internal/module.js:12:17) 
web_1 |  at Object.<anonymous> (/blog/server/app.js:5:15) 
web_1 |  at Module._compile (module.js:410:26) 
web_1 |  at Object.Module._extensions..js (module.js:417:10) 
web_1 |  at Module.load (module.js:344:32) 
web_1 |  at Function.Module._load (module.js:301:12) 
web_1 |  at Function.Module.runMain (module.js:442:10) 
web_1 | [nodemon] app crashed - waiting for file changes before starting... 

Sie wirft es nicht ausdrücklich Modul finden.

Um zu überprüfen, dass der Build-Prozess in der package.json angegebenen richtig die Abhängigkeiten installiert, Im den Behälter mit/bin/bash Einstiegspunkt ausgeführt wird:

docker run -it --rm --entrypoint /bin/bash image_name 

Im Inneren des Behälters, node_modules Ordner vorhanden . Ich kann nodemon server/app auch laufen lassen und App-Läufe richtig ausdrücken (die Verbindung von den anderen Dienstleistungen natürlich verfehlend).

Hier ist es die `Dockerfile' für die ausdrückliche App:

FROM node:argon 
MAINTAINER xxxxxxxx 

# Install globally nodemon 
RUN npm install nodemon -g 

# Make folder that contains blog 
RUN mkdir -p blog 

# Set up working directory (from now on we are located inside /blog) 
WORKDIR /blog 

# Add package 
ADD ./package.json /blog 

# Install dependencies defined in packaje.json 
RUN npm install 

# Copy data 
ADD ./ /blog 

Und hier die docker-compose.yml:

version: '2' 
services: 
    db: 
    image: mongo 
    ports: 
     - "27017:27017" 

    cache: 
    image: redis 
    ports: 
     - "6379:6379" 

    web: 
    environment: 
     NODE_ENV: 'development' 
    build: . 
    command: nodemon server/app.js 
    volumes: 
     - ./:/blog 
    ports: 
     - "8000:8000" 
    depends_on: 
     - cache 
     - db 

Könnte es etwas im Zusammenhang mit VOLUMEN sein?.

In meiner lokalen Umgebung habe ich keinen Ordner node_modules. Ist das volumes Tag, das ich in dem docker-compose.yml definiert habe, das das node_modules folder verbirgt, das mit docker-compose built gebaut wird ?.

Antwort

2

In Ihrem Dockerfile tun Sie das

ADD ./ /blog 

folgende Dies ist in/Blog Ihr lokales Verzeichnis und zur Ergänzung der Bildaufnahme und oyu werden dann Ihre npm Pakete zu installieren, ich in die gleiche/Blog übernehmen Verzeichnis.

Dann in Ihrer Docker-compose Datei sagen Sie Folgendes:

volumes: 
    - ./:/blog 

Dies wird das/Blog-Verzeichnis in Ihrem Bild nehmen, es wegzuwerfen und es mit Ihrem lokalen Verzeichnis zu ersetzen. Da Sie npm install auf Ihrem lokalen Rechner nicht ausgeführt haben, haben Sie dort nicht das Verzeichnis node_modules. Wenn Sie den Container ausführen, wird er also nicht express und damit Ihren Fehler haben.

Um dies zu lösen, sollten Sie Ihre npm-Pakete irgendwo anders als unter/blog, vielleicht global, und dann müssen Sie sich nicht um dieses Problem kümmern.

, das zu tun, würden Sie Ihre dockerfile von

RUN npm install 

zu

RUN npm install -g 

ändern, dass Ihre npm Module global (außerhalb von/Blog) installieren und dann, wenn Sie den Container laufen, es sollte einfach funktionieren.