我有这个Docker Compose配置,我只需创建一个NodeJS容器并在其中安装Angular CLI。
之后docker-compose up -d,我可以使用SSH在容器内进行SSH docker-compose run node bash。ng new可以正常工作,但ng serve似乎不起作用。它已正确启动,控制台中没有错误。但是,如果我访问localhost(我将端口4200映射到80),则不会加载任何内容。
docker-compose up -d
docker-compose run node bash
ng new
ng serve
localhost
我想念什么吗?
在您的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
run
docker- compose.yml
docker-compose run --publish 80:4200 node bash
然后创建有角度的应用程序,然后按您的方式启动它。
测试示例以供将来参考
cd tmp (或任何可写文件夹)
cd tmp
ng new myProject
cd myProject
ng serve --host 0.0.0.0 (–host 0.0.0.0监听容器中的所有接口)
ng serve --host 0.0.0.0
然后在浏览器中,转到localhost,您将看到角度欢迎页面,因为端口4200已发布,并80通过如上所示的publish命令绑定到主机端口。
4200
80
每次遇到端口转发问题时,如果打开一个新终端,将另一个终端保留在执行原始终端的位置run command并运行,则docker ps您会在“端口”列中看到以下内容:
run command
docker ps
0.0.0.0:80->4200/tcp 这意味着端口80上的主机已成功转发到端口4200中的容器。
0.0.0.0:80->4200/tcp
如果看到类似4200/tcp而不是该->部分的内容,则表示没有发布任何映射或端口。
4200/tcp
->