Knoten-und Andockfenster - zu behandeln, wie babel oder Typoskript bauen?
Habe ich eine Knoten-Anwendung, die ich hosten möchten, die in einem Docker-container, die sollte unkompliziert sein, wie in diesem Artikel gesehen:
https://nodejs.org/en/docs/guides/nodejs-docker-webapp/
In meinem Projekt, aber die Quellen können nicht direkt betrieben werden, Sie muss kompiliert werden, von ES6 und/oder Typoskript. Ich benutze Schluck zu bauen mit babel, browserify und tsify - mit unterschiedlichen setups für browser und server.
Was wäre der beste workflow für den Aufbau und Automatisierung docker-images in diesem Fall? Gibt es irgendwelche Ressourcen auf dem web, das beschreibt, wie ein workflow? Sollte die Dockerimage tun, das Gebäude nach npm install
oder sollte ich ein shell-Skript, um all dies zu tun und haben einfach nur das Dockerfile pack Sie alle zusammen?
Wenn das Dockerfile sollte die bauen - das Bild würde müssen enthalten alle dev-Abhängigkeiten, die nicht ideal sind?
Hinweis: ich habe in der Lage, eine docker-container, und führen Sie es - aber das erforderte alle Dateien werden installiert und gebaut vorher.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine mögliche Lösung ist, wickeln Sie Ihre build-Verfahren in einer speziellen docker image. Es ist oft bezeichnet als - generator Bild. Es sollte enthalten alle Ihre build-Abhängigkeiten: nodejs, npm, schlucken, babel, tsc und etc. Es kapselt alle build-Prozess, wodurch die Notwendigkeit für die Installation dieser tools auf dem host.
Zuerst führen Sie den generator Bild ist die Montage des source-code-Verzeichnis als volume. Das gleiche oder ein unterschiedliches Volumen verwendet werden können als Ausgabe-Verzeichnis.
Das erste Bild findet Ihr code und führt alle Befehle zum erstellen von.
Als ersten Schritt nehmen Sie Ihre erstellte code und packen es in die Produktion Andockfenster Bild, wie Sie es jetzt tun.
Hier ist ein Beispiel von docker image builder für die Niederschrift: https://hub.docker.com/r/sandrokeil/typescript/
Es ist ok, um den gleichen docker-generator für mehrere Projekte, wie es ist in der Regel entwickelt, um Allzweck-wrapper um einige Allgemeine Werkzeuge.
Aber es ist ok, Ihre eigenen zu bauen, der beschreibt, mehr komplizierte Verfahren.
Die gute Sache über image builder ist, dass Ihre host-Umgebung bleibt unbelastet und sind Sie frei, um zu versuchen neuere Versionen der compiler/andere Extras/Reihenfolge ändern/Aufgaben parallel, nur durch modifing Dockerfile Ihrer builder-Bild. Und jederzeit können Sie rollback Ihres Experiments mit build-Verfahren.
Ich persönlich bevorzugen, entfernen Sie einfach das dev-Abhängigkeiten nach der Ausführung babel beim bauen:
Die moderne Empfehlung für diese Art der Sache (wie von Docker 17.05) ist die Verwendung eines multi-stage bauen. Auf diese Weise können Sie alle Ihre dev/build-Abhängigkeiten in einem Dockerfile, sondern haben das Endergebnis optimiert und frei von unnötigen code.
Ich bin nicht so vertraut mit typescript, aber hier ist eine Beispiel-Implementierung mit Garn und babel. Mithilfe dieses Dockerfile, können wir bauen ein Bild Entwicklung (mit
docker build --target development .
) für die Ausführung nodemon, tests etc. vor Ort, aber mit einer geradendocker build .
bekommen wir eine schlanke, optimierte Produktionsprozesse Bild, läuft die app mit pm2.Gehen Sie folgendermaßen vor:
Schritt 1: stellen Sie sicher, dass Sie den babel Abhängigkeiten innerhalb der Abhängigkeiten nicht dev Abhängigkeiten auf der Packung.json. Auch eine deploy-Skript, das die Referenzierung von babel von den node_modules-Ordner. Sie rufen dieses script aus innerhalb von docker
Dies ist, was mein Paket.json-Datei sieht wie
bauen ist für Ihre Entwicklung auf Ihrem lokalen Rechner und bereitstellen aufgerufen werden, das aus Euch dockerfile.
Schritt 2: da wir wollen, um die babael transformation uns stellen Sie sicher, hinzufügen .dockerignore mit der build-Ordner, den Sie verwenden, während der Entwicklung.
Dies ist, was mein .dockerignore Datei aussieht.
Schritt 3. Erstellen Sie Ihre dockerfile. unten ist ein Beispiel der Hafenarbeiter Datei
Ich soeben einen großen Samen-app für Typescript und Node.js mit Docker.
Finden Sie es auf GitHub.
Projekt erklärt alle Befehle, die Dockerfile verwendet und kombiniert
tsc
mitgulp
für einige zusätzliche Vorteile.Wenn Sie nicht wollen, um zu überprüfen, aus der repo, hier die details:
Dockerfile
docker-Komponieren.yml
Paket.json
tsconfig.json
Mehr zu bekommen zu der Antwort deiner Frage -- der ts ist zusammengestellt aus den
docker-compose.yml
Datei aufrufen vonnpm run build
die ruft danntsc
.tsc
kopiert dann die Dateien auf diedist
Ordner und eine einfachenode dist/index.js
Befehl wird diese Datei. Anstelle der Verwendung von nodemon, verwenden wirtsc-watch
undgulp.watch
zu beobachten, für änderungen in der app und Feuernode dist/index.js
wieder nach jedem re-compilation.Hoffe, das hilft 🙂 Wenn Sie irgendwelche Fragen haben, lassen Sie es mich wissen!
Für den moment, ich bin mit einem workflow, bei dem:
npm install
undtsd install
lokalgulp
bauen lokalnpm install --production
Diese Weise bekomme ich nur die gewünschten Dateien in das Bild, aber es wäre schöner, wenn das Dockerfile tun konnte, die sich selbst aufbauen.
Dockerfile:
Ich denke, eine komplette Automatisierung in der "bildgebenden Verfahren" könnte geschaffen werden durch den Bau in die Dockerimage Skript und dann das löschen der unerwünschten Dateien, bevor Sie Sie erneut installieren.
Wenn ich verstehe Sie richtig, Sie wollen die Bereitstellung Ihrer web-app innerhalb eines Docker-container und bieten verschiedene Geschmacksrichtungen für verschiedene Ziel-Umgebungen (die Sie erwähnt verschiedene browser und server). (1)
Kommt es an. Wenn Sie möchten, um eine ready-to-go-Bild, es hat zu enthalten alles, was Sie Ihre web-app ausgeführt werden muss. Ein Vorteil ist, dass Sie später nur noch starten müssen die container, einige Parameter, und Sie sind bereit zu gehen.
Während der Entwicklungsphase, das Bild ist nicht wirklich nötig, weil Ihr in der Regel vorab definierten dev-Umgebung. Es kostet Zeit und Ressourcen, wenn Sie erzeugen ein solches Bild nach jeder änderung.
Vorgeschlagener Ansatz: ich würde vorschlagen, ein zwei-Wege-setup:
Docker-container für die Entwicklung und Bereitstellung phase: ich möchte verweisen auf ein Projekt von mir und einem Kollegen: https://github.com/k00ni/Docker-Nodejs-environment
Dieses Andockfenster bietet eine ganze Entwicklung - und deploy-Umgebung, indem Sie die Erhaltung:
und andere JavaScript-Helfer innen der docker-container. Sie einfach link zu Ihrem Projekt-Ordner über ein Volumen innerhalb des docker-container. Es initialisiert Ihrer Umgebung (z.B. setzt alle Abhängigkeiten aus dem Paket.json) und Sie sind gut zu gehen.
Können Sie es verwenden, für Entwicklung Zwecke, so dass Sie und Ihr team sind mit der gleichen Umgebung (Node.js version, NPM version,...) ein Weiterer Vorteil ist, dass die Datei änderungen führen zu einer re-kompilieren von ECMA6/ReactJS/... - Dateien, JavaScript-Dateien (Keine Notwendigkeit, dies zu tun mit der hand nach jeder änderung). Wir verwenden Babel dafür.
Für Bereitstellung Zwecke, verlängern Sie einfach das Docker-image und ändern benötigten Teile. Statt der Verknüpfung Ihrer app im inneren des Behälters, ziehen Sie es über Git (oder so ähnlich). Verwenden Sie den gleichen Keller für Ihre Arbeit.