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?
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.
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
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
}
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