ng服务不在Docker容器中工作

我有这个Docker Composeconfiguration ,我只需创build一个NodeJS容器并在其中安装Angular CLI。

docker-compose up -d ,我可以用docker-compose run node bash在容器内进行SSH操作。 ng new作品完美,但ng serve似乎并不奏效。 它正确启动,在控制台没有错误。 但是,如果我访问localhost (广告我映射端口4200至80),没有加载。

我错过了什么吗?

我看到你的Dockerfile中缺lessExpose行: https ://docs.docker.com/engine/reference/builder/#expose

尝试:

EXPOSE 4200

在你的Dockerfile Docs中

试着把它放在最后一个RUN命令之前。

这一行公开了容器本身的端口(在这种情况下是4200),所以来自compose works的映射(80:4200)。

撰写只是这样做:从主机转发80到容器中的4200。 但它不知道或不关心4200是否真的被听取。 dockerfile中的Expose确保在构build映像的时候,为将来运行的容器公开这个端口,所以你的ng服务器可以监听它。

希望这是帮助。

更新以解决问题:

因此,要用docker-compose run得到你想要的,使用publish来发布端口。 由于run不使用docker-compose.yml的映射,因此忽略它们。 所以像这样使用它:

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

然后创buildangular度的应用程序,并开始它,因为你在做什么。 我正在为将来寻找这个答案的任何人添加步骤:

cd tmp (或任何可写文件夹)

ng new myProject

cd myProject

ng serve -H 0.0.0.0 (-H 0.0.0.0听从容器的所有接口)

然后在您的浏览器中,转到localhost ,您应该看到angular度欢迎页面,因为端口4200已发布,并通过publish命令绑定到主机端口80 ,如上所示。

每当有端口转发问题时,如果你打开一个新的terminal,让另一个terminal执行原来的run command并运行docker ps你将在Ports列中看到:

0.0.0.0:80->4200/tcp这意味着您的端口80上的主机成功地转发到您的端口4200容器。

如果你看到类似4200/tcp东西,而不是->部分,那就意味着没有映射或端口发布。

尝试运行与指定的主机(默认情况下设置为“本地主机”)服务:

 ng serve -H 0.0.0.0 

你正在做的只是安装angular度,你需要在docker文件的末尾有CMD ["npm start"] or CMD ["ng serve"] ,这是docker在启动容器时执行的容器的入口点,只有npm服务器才会启动。

ng serve -H 0.0.0.0 --port <yourportnumber>将使得ngserve在localhost:<yourportnumber>上运行,然后您可以将容器端口号绑定到本地端口