ng服务无法在Docker容器

时间:2017-10-16 20:48:20

标签: angular docker docker-compose

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

docker-compose up -d之后,我可以使用docker-compose run node bash在容器内部进行SSH。 ng new效果很好但ng serve似乎不起作用。它正确启动,控制台没有错误。但是,如果我访问localhost(广告我将端口4200映射到80),则无法加载。

我错过了什么吗?

6 个答案:

答案 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

因此,总而言之:

  1. 不需要在Dockerfile中需要EXPOSE 4200
  2. 要做需要docker-compose.yml文件中的端口映射
  3. 确实需要Dockerfile中的CMD行,并且其中应包含主机参数,例如 CMD ["ng","serve","--host", "0.0.0.0"]
  4. 不需要需要使用docker run
  5. 可以使用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,然后我看到我的应用程序出现在浏览器中