在你的 Dockerfile 中你缺少了Expose行如:
EXPOSE 4200
尝试将其放在 docker 文件中最后一个 RUN 命令之前。
此行公开容器本身的端口(在本例中为 4200),因此 compose 的映射可以正常工作(80:4200)。
Compose 只是这样做:将 80 从主机转发到容器中的 4200。但它不知道也不关心 4200 是否真的被监听。 dockerfile 中的 Expose 确保在构建镜像时,为未来运行的容器公开此端口,以便您的 ng 服务器可以监听它。
解决
所以为了得到你想要的docker-compose run
, use 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
现在您应该看到 Angular 欢迎页面作为端口4200
已发布并绑定到主机端口80
通过发布命令,如我上面所示。
每次遇到端口转发问题时,如果您打开一个新终端,则保留执行原始终端的另一个终端run command
并运行docker ps
您将在“端口”列中看到:
0.0.0.0:80->4200/tcp
这意味着端口 80 上的主机已成功转发到端口 4200 上的容器。
如果你看到类似的东西4200/tcp
而不是->
部分,这意味着没有发布映射或端口。