我正在尝试将React应用程序 jetty 化。我正在使用以下Dockerfile实现此目的。
# base image
FROM node:9.4
# set working directory
WORKDIR /usr/src/app
# install and cache app dependencies
COPY package*.json ./
ADD package.json /usr/src/app/package.json
RUN npm install
# Bundle app source
COPY . .
# Specify port
EXPOSE 8081
# start app
CMD ["npm", "start"]
另外,在我的package.json中,启动脚本定义为
"scripts": {
"start": "webpack-dev-server --mode development --open",
....
}
我将图像构建为:
docker build . -t myimage
我终于运行了图像
docker run IMAGE_ID
然后,此命令将运行图像,但是当我转到localhost:8080或localhost:8081时,我什么都看不到。
但是,当我进入docker容器中获取myimage并执行
curl -X GET http:localhost:8080
时,我可以访问我的react应用程序。我也将其部署在google-kubernetes上,并在此基础上公开了负载均衡器服务。但是,发生了同样的事情,我无法访问暴露端点上的react-app,但是当我登录到容器并发出curl请求时,我正在找回index.html。
因此,如何运行该docker镜像的镜像,以便可以通过浏览器访问该应用程序。
最佳答案
当您在Dockerfile中使用EXPOSE时,它仅声明该服务正在侦听指定的端口(在您的情况下为8081),但实际上并未创建任何端口转发。
要将流量从主机实际转发到服务,必须使用-p
标志指定端口映射
例如:docker run -d -p 80:8080 myimage
将启动一个容器并将请求转发到localhost:80到容器端口8080
在此处了解有关EXPOSE的更多信息https://docs.docker.com/engine/reference/builder/#expose
更新
因此,通常,当您在本地开发节点应用程序并运行webpack dev-server时,它将侦听127.0.0.1,这很好,因为您打算从托管的同一台计算机上访问该站点。但是由于在docker中可以将容器视为一个单独的实例,这意味着您需要能够从“外部”世界访问它,这意味着有必要重新配置dev-server以侦听0.0.0.0(基本上是指分配给“实例”的所有IP地址)
因此,通过更新dev-server配置以侦听0.0.0.0,您应该能够从主机访问您的应用程序。
链接到文档:https://webpack.js.org/configuration/dev-server/#devserverhost
关于reactjs - docker 化后无法在浏览器中打开React应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56759017/