一尘不染

ng服务在Docker容器中不起作用

docker

我有这个Docker Compose配置,我只需创建一个NodeJS容器并在其中安装Angular CLI。

之后docker-compose up -d,我可以使用SSH在容器内进行SSH docker-compose run node bashng new可以正常工作,但ng serve似乎不起作用。它已正确启动,控制台中没有错误。但是,如果我访问localhost(我将端口4200映射到80),则不会加载任何内容。

我想念什么吗?


阅读 314

收藏
2020-06-17

共1个答案

一尘不染

在您的Dockerfile中,您缺少Expose行,例如:

EXPOSE 4200

尝试将其放在docker文件中的最后一个RUN命令之前。

该行显示了容器本身中的端口(在这种情况下为4200),因此来自compose的映射起作用(80:4200)。

Compose只是这样做:将80从主机转发到容器中的4200。但是它并不知道或不在乎4200是否正在被收听。dockerfile中的Expose可确保何时构建映像,以便为将来运行的容器公开此端口,以便您的ng服务可以收听它。


解析度

因此,要获取所需的内容docker-compose run,请使用publish发布端口。由于run不使用您的映射docker- compose.yml,因此会忽略它们。所以像这样使用它:

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

然后创建有角度的应用程序,然后按您的方式启动它。


测试示例以供将来参考

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

ng new myProject

cd myProject

ng serve --host 0.0.0.0 (–host 0.0.0.0监听容器中的所有接口)

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

每次遇到端口转发问题时,如果打开一个新终端,将另一个终端保留在执行原始终端的位置run command并运行,则docker ps您会在“端口”列中看到以下内容:

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

如果看到类似4200/tcp而不是该->部分的内容,则表示没有发布任何映射或端口。

2020-06-17