webentwicklung-frage-antwort-db.com.de

ng funktioniert nicht im Docker-Container

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?

8
Axiol

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.

21
Juan

versuchen Sie, ng serve mit dem angegebenen Host auszuführen (der standardmäßig auf 'localhost' gesetzt ist):

ng serve -H 0.0.0.0
9
Andriy

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:

  1. sie nicht benötigen die Zeile EXPOSE 4200 in der Docker-Datei
  2. sie do benötigen die Portzuordnung in der Datei docker-compose.yml
  3. sie do benötigen die CMD-Zeile in der Docker-Datei, und sie sollte den Host-Parameter enthalten, z. B. .CMD ["ng","serve","--Host", "0.0.0.0"]
  4. sie nicht müssen docker run verwenden.
  5. sie can verwenden docker-compose up, wodurch die Portzuordnungen aus der Datei docker-compose.yml abgerufen werden.
3
SamRR_75
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
  }
0
Carlos Bastos

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 

0
Vignajeth