web-dev-qa-db-fra.com

le service ne fonctionne pas dans le conteneur Docker

J'ai cette configuration Docker Compose où je crée simplement un conteneur NodeJS et installe Angular CLI à l’intérieur.

Après un docker-compose up -d, je suis capable de SSH à l'intérieur du conteneur avec docker-compose run node bash. ng new fonctionne parfaitement mais ng serve ne semble pas fonctionner. Il est lancé correctement, aucune erreur dans la console. Mais, si je visite localhost (le port 4200 à 80a été mappé), rien ne se charge.

Est-ce que je manque quelque chose?

8
Axiol

Dans votre fichier Docker, il manque la ligne Exposer telle que:

EXPOSE 4200

Essayez de le placer avant votre dernière commande RUN dans le fichier docker.

Cette ligne expose le port dans le conteneur lui-même (4200 dans ce cas) afin que le mappage de composition fonctionne (80: 4200). 

Compose fait simplement ceci: transférer 80 de l'hôte vers 4200 dans le conteneur. Mais il ne sait pas ou se soucie de savoir si le 4200 est réellement écouté. Le fichier exposé dans le fichier de docker veille à ce que, lors de la création de l'image, expose ce port pour les futurs conteneurs en cours d'exécution, afin que votre serveur puisse l'écouter.


Résolution

Donc, pour obtenir ce que vous voulez avec docker-compose run, utilisez publish pour publier les ports. Comme run n'utilise pas les mappages de votre docker-compose.yml, il les ignore. Alors utilisez-le comme ça: 

docker-compose run --publish 80:4200 node bash

Créez ensuite l'application angulaire et démarrez-la comme vous le faisiez. 


Exemple de test pour référence future

cd tmp (ou tout dossier accessible en écriture)

ng new myProject

cd myProject

ng serve --Host 0.0.0.0 (--Host 0.0.0.0 pour écouter toutes les interfaces du conteneur)

Ensuite, dans votre navigateur, accédez à localhost et vous devriez voir la page d'accueil angulaire maintenant, car le port 4200 est publié et lié au port hôte 80 par le biais de la commande de publication, comme indiqué ci-dessus.

Chaque fois que vous rencontrez des problèmes de transfert de port, si vous ouvrez un nouveau terminal en conservant l'autre terminal sur lequel vous avez exécuté le run command d'origine et exécutez docker ps, vous verrez ceci dans la colonne Ports:

0.0.0.0:80->4200/tcp, ce qui signifie que votre hôte sur le port 80 transfère correctement votre conteneur sur le port 4200. 

Si vous voyez quelque chose comme 4200/tcp et pas la partie ->, cela signifie qu'il n'y a pas de mappages ou de ports publiés.

21
Juan

essayez d’exécuter ng serve avec l’hôte spécifié (défini par défaut sur «localhost»):

ng serve -H 0.0.0.0
9
Andriy
ng serve -H 0.0.0.0 

avec la propriété 1000 poll dans angular-cli.json (pour la détection de modification de fichier)

"defaults": {
    "styleExt": "scss",
    "component": {},
    "poll": 1000
  }
0
Carlos Bastos

ce que vous faites est juste d’installer l’angle, vous devez avoir CMD ["npm start"] or CMD ["ng serve"] à la fin de dockerfile, c’est le point d’entrée du conteneur que docker exécute lorsque vous démarrez le conteneur, puis seulement le serveur npm démarre.

ng serve -H 0.0.0.0 --port <yourportnumber> obligera ngserve à s'exécuter sur localhost:<yourportnumber> ici après que vous puissiez lier le numéro de port du conteneur à votre port local 

0
Vignajeth