ng serve在Docker容器中不工作

wz3gfoph  于 2023-05-16  发布在  Docker
关注(0)|答案(7)|浏览(251)

我有这个Docker Compose configuration,我只是创建一个NodeJS容器并在里面安装Angular CLI。
docker-compose up -d之后,我能够使用docker-compose run node bash在容器内部进行SSH。ng new工作完美,但ng serve似乎不工作。启动正确,控制台没有错误。但是,如果我访问localhost(我将端口4200Map到80),则什么也加载不了。
我错过什么了吗?

bakd9h0s

bakd9h0s1#

在你的Dockerfile中,你缺少了Expose一行,比如:
EXPOSE 4200
尝试将其放置在docker文件中的最后一个RUN命令之前。
这一行暴露了容器本身中的端口(在本例中为4200),因此来自compose的Map可以工作(80:4200)。
Compose只是这样做:从主机转发80到容器中的4200。但它不知道或不关心4200是否真的被监听。dockerfile中的Expose确保在构建镜像时,为未来运行的容器公开此端口,以便您的ng服务器可以侦听它。

分辨率

因此,要使用docker-compose run获得所需的功能,请使用publish发布端口。由于run不使用来自docker-compose.yml的Map,因此会忽略它们。所以像这样使用它:
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,您现在应该看到Angular 欢迎页面,因为端口4200已通过publish命令发布并绑定到主机端口80,如我上面所示。
每次遇到端口转发问题时,如果你打开一个新的终端,保留原来执行run command的另一个终端,然后运行docker ps,你会在Ports列中看到:
0.0.0.0:80->4200/tcp,这意味着端口80上的主机成功转发到端口4200上的容器。
如果您看到类似4200/tcp的内容,而不是->部分,则意味着没有发布Map或端口。

ztmd8pv5

ztmd8pv52#

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

ng serve -H 0.0.0.0

UPDATE注意,目前(@angular/cli@7)选项为--host

ng serve --host 0.0.0.0 --disableHostCheck

感谢@antirealm添加--disableHostCheck:)

v64noz0r

v64noz0r3#

使用ng serve --host 0.0.0.0对我来说一直很有效。
这一点至关重要的原因是,如果没有它,angular进程只会监听容器内部的localhost接口 * -因此即使使用docker端口Map,也不会接收到来自容器外部的连接。

**Angular Live Development Server正在监听localhost:3000

但是如果添加参数--host 0.0.0.0,那么angular进程将侦听所有接口,并且docker端口Map将允许来自容器外部的连接到达它。

**Angular Live Development Server正在监听0.0.0.0:3000

所以,总结一下:
1.你需要Dockerfile中的EXPOSE 4200
1.你确实需要docker-compose.yml文件中的端口Map
1.你确实需要Dockerfile中的CMD行,它应该包含host参数,例如CMD ["ng","serve","--host", "0.0.0.0"]
1.您需要使用docker run
1.您可以**使用docker-compose up,它将从docker-compose.yml文件中获取端口Map。

np8igboo

np8igboo4#

在我的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,然后我可以看到我的应用程序出现在浏览器中。

ubby3x7f

ubby3x7f5#

项目树

.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

参考资料:

pqwbnv8z

pqwbnv8z6#

你正在做的只是安装angular,你需要在dockerfile的末尾有CMD ["npm start"] or CMD ["ng serve"],这是当你启动容器时docker执行的容器的入口点,只有这样npm服务器才会启动。
在将容器端口号绑定到本地端口之后,ng serve -H 0.0.0.0 --port <yourportnumber>将使ngserve在localhost:<yourportnumber>上运行

d6kp6zgx

d6kp6zgx7#

ng serve -H 0.0.0.0

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

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

相关问题