Ich habe eine Hallo, Welt Express-App, die ich mit nodemon
ausführe, damit der Server bei jeder Änderung einer Datei neu gestartet wird.
Ich verpacke die App als Docker-Image.
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
führt nodemon -L index.js
wie in package.json definiert aus
Ich kann das Image jedoch nicht jedes Mal erstellen, wenn ich eine Änderung an meiner App vornehme. Ich habe auch eine docker-compose.yml -Datei, in der ich die Option build
spezifiziere, aber ich kann den Container immer noch nicht zum Neuladen bekommen
version: "2"
services:
rpro:
build: .
command: npm start
ports:
- "3000:3000"
volumes:
- /opt/app
Hier das gesamte Repo
Wie erreiche ich einen Neustart des Servers bei Dateiänderungen mit Docker-Containern? Was ist in einem solchen Fall der übliche Entwicklungs-Workflow?
Ah, das Problem scheint bei docker-compose.yml volumes
param zu liegen. Ändern Sie es auf
volumes:
- .:/opt/app
bringt es zum laufen. Er weist Docker an, den Anwendungsordner .
auf dem Host in den /opt/app
im Container einzuhängen.
Nachdem Sie docker-compose up
ausgeführt haben, wird der Server bei Dateiänderungen neu gestartet.
Ich bin mir nicht sicher, ob ich das als Problem bezeichnen würde, da dies 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 durchgeführt. Wenn @jatin dies erwähnt, können Sie Ihr Compose-Verzeichnis über - .:/opt/app
oder ähnliches verknüpfen.
Wenn Sie dies tun, müssen Sie in Ihrem Build COPY . /opt/app
nicht verwenden, da er über dieses Verzeichnis geladen wird.
Beachten Sie, wenn Sie docker-compose up --build
Docker nicht neu erstellen (den Server neu starten), wenn sich die Dateien auf dem bereitgestellten Volume ändern, sondern nur, wenn sich die Dateien auf dem erstellten Volume ändern. Da Sie die Dateien anscheinend über nodemon überwachen, wird may neu gestartet (da Sie die Legacy-Überwachung verwenden, sollte dies nur beachtet werden, dass es Fälle gibt, in denen die Dateiänderung möglicherweise nicht erkannt wird).
Grundsätzlich ist dies für die Entwicklung in Ordnung. In der Produktion möchten Sie jedoch watch
nicht verwenden, und Sie würden Docker höchstwahrscheinlich verwenden, um den Container zu überwachen und neu zu starten, wenn er beendet wird (restart: always
) oder einen Prozessmanager im Nicht-Daemon-Modus verwenden.