我有这个Docker Compose configuration,我只是创建一个NodeJS容器并在里面安装Angular CLI。
在docker-compose up -d
之后,我能够使用docker-compose run node bash
在容器内部进行SSH。ng new
工作完美,但ng serve
似乎不工作。启动正确,控制台没有错误。但是,如果我访问localhost
(我将端口4200Map到80),则什么也加载不了。
我错过什么了吗?
我有这个Docker Compose configuration,我只是创建一个NodeJS容器并在里面安装Angular CLI。
在docker-compose up -d
之后,我能够使用docker-compose run node bash
在容器内部进行SSH。ng new
工作完美,但ng serve
似乎不工作。启动正确,控制台没有错误。但是,如果我访问localhost
(我将端口4200Map到80),则什么也加载不了。
我错过什么了吗?
7条答案
按热度按时间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或端口。ztmd8pv52#
尝试使用指定的主机运行
ng serve
(默认设置为'localhost'):UPDATE注意,目前(@angular/cli@7)选项为
--host
:感谢@antirealm添加
--disableHostCheck
:)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。np8igboo4#
在我的
Dockerfile
中,我正在尝试--disable-host-check
选项,但浏览器将无限期等待:因此,我在
docker-compose.yml
文件中添加了一个hostname: dev.musicng
属性,其条目在/etc/hosts
文件中:127.0.1.1 dev.musicng
,然后我可以看到我的应用程序出现在浏览器中。ubby3x7f5#
项目树
.docker\node\Dockerfile
在基于节点的容器上安装和配置Angular
docker-compose.yml
ng serve --host 0.0.0.0--poll=2000
--host 0.0.0.0
侦听所有容器接口--poll=2000
侦听文件夹中的更改启动
在项目根目录中运行
搞定!
项目
https://github.com/wictorChaves/docker-helper/tree/master/projetos/compose/angular
参考资料:
pqwbnv8z6#
你正在做的只是安装angular,你需要在dockerfile的末尾有
CMD ["npm start"] or CMD ["ng serve"]
,这是当你启动容器时docker执行的容器的入口点,只有这样npm服务器才会启动。在将容器端口号绑定到本地端口之后,
ng serve -H 0.0.0.0 --port <yourportnumber>
将使ngserve在localhost:<yourportnumber>
上运行d6kp6zgx7#
在angular-cli.json中使用1000 poll属性(用于文件更改检测)