2016-07-13 12 views
5

Ich habe eine Hallo, Welt Express-App, die ich mit nodemon laufen, so dass, wenn ich eine Datei ändern den Server neu gestartet.Docker: Neuladen einer Nodejs App mit Nodemon

Ich verpacke die App als ein Docker-Bild.

Dockerfile:

FROM node:6.3.0 

RUN mkdir -p /opt/app 
WORKDIR /opt/app 

COPY . /opt/app 

RUN npm install 

EXPOSE 3000 

CMD ["npm", "start"] 

npm start verläuft nodemon -L index.js wie definiert in package.json

Allerdings kann ich bauen nicht das Bild jedes Mal wenn ich auf die meine app eine Änderung vornehmen. Ich habe auch eine Docker-compose.yml Datei, in der ich die build Option angeben, aber ich kann immer noch nicht den Behälter mit

version: "2" 
services: 
    rpro: 
    build: . 
    command: npm start 
    ports: 
     - "3000:3000" 
    volumes: 
     - /opt/app 

Hier denen die entire repo


nachladen erhalten

Wie erreiche ich Server-Neustart bei Dateiänderungen mit Docker-Containern? Was ist der übliche Dev-Workflow in einem solchen Fall?

+0

docker-dev ist gut für diese Art von Dingen, obwohl ich denke nicht, dass es in der Produktion laufen sollte – meda

+0

@meda könnten Sie einen Link zu docker-dev bereitstellen? – Jatin

+0

Entschuldigung, ich meinte Node-Dev – meda

Antwort

8

Ah, scheint das Problem mit Docker-compose.ymlvolumes param zu sein. Ändern in

volumes: 
    - .:/opt/app 

macht es funktioniert. Er weist docker an, den Anwendungsordner . auf dem Host an die /opt/app im Container anzuhängen.

Dann nach docker-compose up, startet der Server im Falle von Dateiänderungen neu.

+0

Innerhalb Ihrer Dockerfile müssten Sie nicht die RUN mkdir oder die COPY-Befehle tun. Ihre Quelle und Ihr Ziel sind hier gleich: 'COPY./opt/app' – duhseekoh

1

Nicht sicher, ob ich das ein Problem nennen würde, da es der übliche Workflow ist - wenn sich eine Datei ändert, die sich im Container befindet, wird eine Neuerstellung ausgelöst. Wenn Sie die Datei nicht in den Container stellen, wird dies nicht ausgeführt, wie von @jatin erwähnt, können Sie Ihr Verzeichnis Compose unter - .:/opt/app oder ähnlichem verknüpfen.

Wenn Sie dies tun, müssen Sie nicht COPY . /opt/app in Ihrem Build verwenden, da es über dieses Verzeichnis mounten wird.

Hinweis, wenn Sie docker-compose up --build Docker werden (den Server neu starten), wenn die Dateien im montierten Volumenänderung nicht wieder aufbauen, nur dann, wenn Dateien im Build ändern. Da es scheint, dass Sie die Dateien über nodemon beobachten, es kann neu starten (da Sie die Legacy-Uhr verwenden, sollten Sie beachten Sie, es gibt Fälle, in denen es die Datei ändern möglicherweise nicht erkennen).

Dies ist im Grunde in Ordnung für die Entwicklung, aber in der Produktion, deutlich würden Sie nicht watch verwenden mögen, und Sie höchstwahrscheinlich würde Docker verwenden, um den Behälter zu überwachen und neu starten, wenn es beendet wird (restart: always) oder einen Prozess-Manager in nicht verwenden -Daemon-Modus.

+0

* "Hinweis, wenn Sie docker-komponieren" Docker wird nicht neu erstellt (starten Sie den Server neu), wenn die Dateien im bereitgestellten Volume ändern, nur wenn Dateien im Build ändern. "* Ist es nicht andersherum? Wenn ich den 'Volumes'-Parameter aus meinem docker-compose.yml entferne und dann einen' docker-compose up' mache, werden die Änderungen nicht übernommen, bis ich nach jeder Änderung explizit einen 'docker-compose build' mache. – Jatin

+0

Ja, wenn das Bild bereits erstellt wurde, müssen Sie '--build' hinzufügen. Wenn Sie jedoch '--build' verwenden und keine Änderungen vorgenommen werden, sollten das Bild und der Container unberührt bleiben. – ldg