我有这个Docker Compose configuration,我只需创建一个NodeJS容器并在其中安装Angular CLI。
在docker-compose up -d
之后,我可以使用docker-compose run node bash
在容器内部进行SSH。 ng new
效果很好但ng serve
似乎不起作用。它正确启动,控制台没有错误。但是,如果我访问localhost
(广告我将端口4200映射到80),则无法加载。
我错过了什么吗?
答案 0 :(得分:25)
在您的Dockerfile中,您缺少Expose行,例如:
EXPOSE 4200
尝试将它放在docker文件中的最后一个RUN命令之前。
此行公开容器本身的端口(在本例中为4200),因此compose的映射有效(80:4200)。
撰写就是这样:将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
我在上面展示了。
每当您遇到端口转发问题时,如果您打开一个新终端,保持另一个终端执行原始run command
并运行docker ps
,您将在“端口”列中看到此信息:
0.0.0.0:80->4200/tcp
表示端口80上的主机成功转发到端口4200中的容器。
如果您看到4200/tcp
而不是->
部分,则表示没有发布映射或端口。
答案 1 :(得分:12)
尝试使用指定的主机运行ng serve
(默认设置为'localhost'):
ng serve -H 0.0.0.0
<强>更新强>
注意,当前(@ angular / cli @ 7)选项是--host
:
ng serve --host 0.0.0.0
答案 2 :(得分:4)
使用ng serve --host 0.0.0.0
一直对我有用。
这至关重要的原因是,没有它,角度过程只会在容器内的localhost接口上监听-因此,即使使用docker端口映射,也不会从容器外部进行连接被接收。
** Angular Live Development Server正在localhost:3000上监听
但是,如果您添加参数--host 0.0.0.0
,则角度进程将在所有接口上侦听,并且docker端口映射将允许来自容器外部的连接到达它。
** Angular Live Development Server正在监听0.0.0.0:3000
因此,总而言之:
EXPOSE 4200
行CMD ["ng","serve","--host", "0.0.0.0"]
docker run
docker-compose up
,它将从docker-compose.yml文件中获取端口映射。答案 3 :(得分:0)
你正在做的只是安装angular,你需要在dockerfile的末尾有CMD ["npm start"] or CMD ["ng serve"]
这是Docker在启动容器时执行的容器的入口点,只有npm服务器才会启动
ng serve -H 0.0.0.0 --port <yourportnumber>
将使ngserve在localhost:<yourportnumber>
上运行
答案 4 :(得分:0)
ng serve -H 0.0.0.0
在angular-cli.json中使用1000个poll属性(用于文件更改检测)
"defaults": {
"styleExt": "scss",
"component": {},
"poll": 1000
}
答案 5 :(得分:0)
在我的 Could not determine type for: fG.Model.availablitySchedule, at table: tutor_availablity_schedules, for columns: [org.hibernate.mapping.Column(available_schedules)]
中,我尝试使用Dockerfile
选项,但浏览器将无限期等待:
--disable-host-check
因此,我在CMD ["ng","serve","--host", "0.0.0.0", "--disable-host-check"]
文件中添加了一个hostname: dev.musicng
属性,并在docker-compose.yml
文件中添加了该条目:/etc/hosts
,然后我看到我的应用程序出现在浏览器中