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

Axi*_*iol 14 docker docker-compose angular

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

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

我错过了什么吗?

Jua*_*uan 30

在您的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通过上面显示的发布命令绑定到主机端口.

每当您遇到端口转发问题时,如果您打开一个新终端,保持另一个终端执行原始run command运行并运行,docker ps您将在Ports列中看到:

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

如果您看到类似4200/tcp而不是->部分,则表示没有发布映射或端口.

  • 我正在使用 `docker-compose` 和 `angular-cli`,并且必须使用这个 `command` 行才能工作: `command: "npm run -- ng serve --host 0.0.0.0 --disable-主机检查"`。`--host` 部分由 `npm run` 解析,而不是在没有 `--` 的情况下由 `ng serve` 解析。 (2认同)
  • 我认为“EXPOSE 4200”只是向其他开发人员使用你的 Dockerfile 的一个指示,它并没有真正做任何事情 https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#expose (2认同)

And*_*riy 19

尝试ng serve使用指定的主机运行(默认设置为'localhost'):

ng serve -H 0.0.0.0
Run Code Online (Sandbox Code Playgroud)

  • 还添加 --disableHostCheck (2认同)

小智 8

使用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. 并不需要EXPOSE 4200在Dockerfile线
  2. 确实需要docker-compose.yml文件中的端口映射
  3. 确实需要Dockerfile中的CMD行,并且其中应包含host参数,例如 CMD ["ng","serve","--host", "0.0.0.0"]
  4. 并不需要使用docker run
  5. 可以使用docker-compose up,这将从docker-compose.yml文件中获取端口映射。