Ich habe diese Docker Compose-Konfiguration , bei der ich einfach einen NodeJS-Container erstelle und Angular CLI innen installiere.
Nach einem docker-compose up -d
kann ich mit docker-compose run node bash
innerhalb des Containers SSH erstellen. ng new
funktioniert einwandfrei, aber ng serve
scheint nicht zu funktionieren. Es wurde ordnungsgemäß gestartet, es wurde kein Fehler in der Konsole angezeigt. Wenn ich jedoch localhost
besuche (ich habe Port 4200 auf 80 abgebildet), wird nichts geladen.
Fehlt mir etwas?
In Ihrer Docker-Datei fehlt die Zeile Expose wie:
EXPOSE 4200
Platzieren Sie es vor Ihrem letzten RUN-Befehl in der Docker-Datei.
Diese Zeile zeigt den Port im Container selbst (in diesem Fall 4200), damit das Mapping von compose funktioniert (80: 4200).
Compose macht dies einfach: Leiten Sie 80 vom Host an 4200 im Container weiter. Es ist jedoch nicht wichtig, ob die 4200 tatsächlich gehört wird. Die Expose in der Docker-Datei stellt sicher, dass bei der Erstellung des Images dieser Port für die künftig ausgeführten Container verfügbar gemacht wird, damit Ihr ng-Server sie abhören kann.
Auflösung
Um mit docker-compose run
das gewünschte Ergebnis zu erhalten, verwenden Sie publish
, um die Ports zu veröffentlichen. Da run
die Zuordnungen von Ihrem docker-compose.yml
nicht verwendet, werden sie ignoriert. Verwenden Sie es also so:
docker-compose run --publish 80:4200 node bash
Erstellen Sie dann die Winkel-App und starten Sie sie wie zuvor.
Testbeispiel für zukünftige Referenz
cd tmp
(oder ein beliebiger beschreibbarer Ordner)
ng new myProject
cd myProject
ng serve --Host 0.0.0.0
(--Host 0.0.0.0 zum Abhören aller Schnittstellen aus dem Container)
Gehen Sie dann in Ihrem Browser zu localhost
. Sie sollten jetzt die winkelige Begrüßungsseite sehen, da der Port 4200
veröffentlicht und über den Befehl zum Publizieren an den Host-Port 80
gebunden ist, wie oben gezeigt.
Jedes Mal, wenn Sie Probleme mit der Portweiterleitung haben, öffnen Sie ein neues Terminal, in dem Sie den ursprünglichen run command
ausgeführt haben und docker ps
ausgeführt haben. In der Spalte Ports wird Folgendes angezeigt:
0.0.0.0:80->4200/tcp
bedeutet, dass Ihr Host an Port 80 erfolgreich an Ihren Container in Port 4200 weitergeleitet wird.
Wenn Sie etwas wie 4200/tcp
und nicht den ->
-Teil sehen, bedeutet dies, dass keine Zuordnungen oder Ports veröffentlicht sind.
versuchen Sie, ng serve
mit dem angegebenen Host auszuführen (der standardmäßig auf 'localhost' gesetzt ist):
ng serve -H 0.0.0.0
Die Verwendung von ng serve --Host 0.0.0.0
hat immer für mich funktioniert.
Der Grund dafür ist, dass der Winkelprozess ohne sie nur auf der localhost-Schnittstelle im Container lauscht. Daher werden selbst mit der Dockerport-Zuordnung keine Verbindungen von außerhalb des Containers empfangen.
** Angular Live Development Server hört auf localhost: 3000
Wenn Sie jedoch den Parameter --Host 0.0.0.0
hinzufügen, überwacht der Winkelprozess alle Schnittstellen, und die Docker-Port-Zuordnung ermöglicht Verbindungen von außerhalb des Containers, um ihn zu erreichen.
** Angular Live Development Server hört auf 0.0.0.0:3000
Also zusammenfassend:
EXPOSE 4200
in der Docker-DateiCMD ["ng","serve","--Host", "0.0.0.0"]
docker run
verwenden.docker-compose up
, wodurch die Portzuordnungen aus der Datei docker-compose.yml abgerufen werden.ng serve -H 0.0.0.0
mit 1000 poll -Eigenschaft in angle-cli.json (zur Erkennung von Dateiänderungen)
"defaults": {
"styleExt": "scss",
"component": {},
"poll": 1000
}
was Sie gerade tun, ist die Installation des Winkels. Sie müssen CMD ["npm start"] or CMD ["ng serve"]
am Ende von dockerfile haben. Dies ist der Eingangspunkt für den Container, den das Docker beim Start des Containers ausführt. Erst dann startet der npm-Server.
ng serve -H 0.0.0.0 --port <yourportnumber>
bewirkt, dass der ngserve auf localhost:<yourportnumber>
ausgeführt wird, nachdem Sie die Containerportnummer an Ihren lokalen Port gebunden haben