【问题标题】:ng serve not working in Docker containerng serve 在 Docker 容器中不起作用
【发布时间】:2018-03-28 11:30:35
【问题描述】:

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

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

我错过了什么吗?

【问题讨论】:

  • 您可以将 Dockerfile 发布到您的 ./.docker/node/ 文件夹中吗?
  • 没关系,在github上看到了。

标签: angular docker docker-compose


【解决方案1】:

在您的 Dockerfile 中,您缺少 Expose 行,例如:

EXPOSE 4200

尝试将它放在 docker 文件中的最后一个 RUN 命令之前。

这一行公开了容器本身的端口(在本例中为 4200),因此来自 compose 的映射有效(80:4200)。

Compose 只是这样做:将 80 从主机转发到容器中的 4200。但它不知道也不关心 4200 是否真的被收听了。 dockerfile 中的 Expose 确保在构建映像时,为将来运行的容器公开此端口,以便您的 ng serve 可以监听它。


分辨率

所以要使用docker-compose run 获得您想要的,请使用publish 发布端口。由于run 不使用来自您的docker-compose.yml 的映射,它会忽略它们。所以像这样使用它:

docker-compose run --publish 80:4200 node bash

然后创建 Angular 应用程序并按照您的方式启动它。


供将来参考的测试示例

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 而不是-> 部分,则表示没有发布任何映射或端口。

【讨论】:

  • 哦,我不知道你必须手动公开端口,谢谢。但是,它仍然不起作用。如您在此处看到的,端口已暴露github.com/Axiol/Docker-Angular-CLI/blob/master/.docker/node/… 但仍然无法加载
  • @Axiol 我在我的回复中添加了更新,其中包含所有步骤以获得您想要的!
  • 嗯,这就是我所说的答案!与文档相比,我对 Docker 端口转发的了解更多...非常感谢 :)
  • 我正在使用docker-composeangular-cli,并且必须使用此command 行才能使其工作:command: "npm run -- ng serve --host 0.0.0.0 --disable-host-check"--host 部分被 npm run 解析,而不是 ng serve 没有 --
  • 我认为EXPOSE 4200 只是其他开发人员使用您的 Dockerfile 的指示,它并没有真正做任何事情docs.docker.com/develop/develop-images/…
【解决方案2】:

尝试在指定主机的情况下运行ng serve(默认设置为“localhost”):

ng serve -H 0.0.0.0

更新 注意,目前(@angular/cli@7)选项是--host

ng serve --host 0.0.0.0

【讨论】:

  • 它仍然无法加载
  • 添加 --disableHostCheck 也
【解决方案3】:

使用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 文件中获取端口映射。

【讨论】:

    【解决方案4】:

    在我的Dockerfile 中,我尝试了--disable-host-check 选项,但浏览器会无限期等待:

    CMD ["ng","serve","--host", "0.0.0.0", "--disable-host-check"]
    

    所以我在我的docker-compose.yml 文件中添加了一个hostname: dev.musicng 属性,它在/etc/hosts 文件中的条目:127.0.1.1 dev.musicng 然后我可以看到我的应用程序出现在浏览器中。

    【讨论】:

      【解决方案5】:

      您所做的只是安装 angular,您需要在 dockerfile 的末尾添加 CMD ["npm start"] or CMD ["ng serve"] 这是容器的入口点,当您启动容器时 docker 会执行该入口点,然后 npm 服务器才会启动。

      ng serve -H 0.0.0.0 --port <yourportnumber> 将使 ngserve 在localhost:<yourportnumber>there 上运行,您可以将容器端口号绑定到本地端口

      【讨论】:

      • 如前所述,我手动连接到容器运行ng serve
      【解决方案6】:
      ng serve -H 0.0.0.0 
      

      在 angular-cli.json 中有 1000 个 poll 属性(用于文件更改检测)

      "defaults": {
          "styleExt": "scss",
          "component": {},
          "poll": 1000
        }
      

      【讨论】:

      • 您的回答对细节有点轻描淡写。你能解释一下这是做什么的,为什么它会解决问题?
      【解决方案7】:

      项目树

      .docker\node\Dockerfile

      在基于节点的容器上安装和配置 Angular

      FROM node:latest
      
      RUN apt-get update && apt-get install -y vim
      
      EXPOSE 4200
      
      USER node
      
      RUN mkdir /home/node/.npm-global
      ENV PATH=/home/node/.npm-global/bin:$PATH
      ENV NPM_CONFIG_PREFIX=/home/node/.npm-global
      
      RUN npm install -g @angular/cli@8.0.6
      

      docker-compose.yml

      • 构建上面的 Dockerfile

      • 暴露4200端口,运行命令:

        ng serve --host 0.0.0.0 --poll=2000

      --host 0.0.0.0监听所有容器接口
      --poll=2000监听文件夹变化

      version: "2.1"
      
      services:
        node:
          container_name: angularcontainer
          build: ./.docker/node/
          ports:
            - 4200:4200
          volumes:
            - "./:/var/www/html"
          working_dir: /var/www/html
          command: ng serve --host 0.0.0.0 --poll=2000
      

      开始

      在项目根目录中运行

      docker compose up
      

      完成了!

      项目

      https://github.com/wictorChaves/docker-helper/tree/master/projetos/compose/angular

      参考:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-07
        • 2019-11-01
        • 2020-12-20
        • 1970-01-01
        • 1970-01-01
        • 2017-02-08
        • 2018-11-21
        相关资源
        最近更新 更多