泊坞窗化后无法在浏览器中打开React应用

时间:2019-06-25 17:13:21

标签: reactjs docker kubernetes dockerfile google-kubernetes-engine

我正在尝试对React应用进行dockerize。我正在使用以下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映像的映像,以便可以通过浏览器访问应用程序。

1 个答案:

答案 0 :(得分:1)

当您在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