这个 dockerfile 是否正确设置为在端口 5000 上构建 React.js?

Is this dockerfile set correctly to serve a React.js build on port 5000?

我有一个 React.js 应用程序,我已经 docker 化了它,直到昨天我发现有某种错误是由于节点版本 17 导致的,所以它工作正常,所以我决定将 docker 图像的节点版本恢复到 16。一切都很好,但是由于我这样做了,我无法在指定端口上将 docker 图像发送到 运行。

这是我的docker文件:

ROM node:16.10-alpine as build

RUN mkdir /app

WORKDIR /app

COPY /front-end/dashboard/package.json /app

RUN npm install

COPY ./front-end/dashboard /app

RUN npm run build

# Install `serve` to run the application.
RUN npm install -g serve

# Set the command to start the node server.
CMD serve -s -n build

# Tell Docker about the port we'll run on.
EXPOSE 5000

如您所见,我正在构建一个版本,然后在端口 5000 上提供服务,但由于某种原因它不再工作,但它曾经工作正常。

我在 docker 中看到的输出是:

Serving! │

│ │

│ - 本地:http://localhost:3000 │

│ - 在您的网络上:http://172.17.0.2:3000

当我转到 localhost:3000 时,没有任何反应,这很好,但它应该在端口 5000 上工作,但它 运行 不在那里。知道为什么我不能像以前那样 运行 docker 图像在端口 5000 上构建吗?

我在端口 5000 上使用 docker 运行 -p 5000:5000 到 运行 但这并不能解决问题。

从日志中您可以看到您的应用程序可能正在侦听 localhost:3000 上的流量。您的 EXPOSE 5000 行不会改变该行为,但会使 Docker(和其他用户)认为端口 5000 很重要。由于没有任何东西在端口 3000 上侦听,显然你应该得到 'connection refused'。您可能需要查找 https://docs.docker.com/engine/reference/builder/#expose

要摆脱这种情况:

  • 确保您的 dockerized 进程正在侦听 0.0.0.0:5000。您必须将 -l tcp://0.0.0.0:5000 添加到您的 CMD 行(参见 https://github.com/vercel/serve/blob/main/bin/serve.js#L117

  • 当运行容器时,确保使用docker run -p 5000:5000 ...

    公开端口
  • 如果需要告诉您的 docker 主机的防火墙允许流量到 :5000

现在,如果您连接到 http://:5000,您应该会看到应用程序的响应。

您的应用正在侦听端口 3000。因此您需要将要在主机上使用的任何端口映射到端口 3000。如果要使用端口 5000,则应使用 -p 5000:3000。然后您应该可以在主机上使用 localhost:5000 访问它。

您应该将容器视为独立于主机的机器。因此,当容器说它正在侦听 localhost:3000 时,这意味着容器上下文中的本地主机。不是主持人。

由于这种完全相同的情况,我在工作中遇到了问题。经过几个小时查看我们公司的部署管道后,我发现了罪魁祸首...

服务包。

他们将默认端口从 5000 更改为 3000。
资料来源:serve github releases

因此,为了解决您的问题,我建议在您的 serve 命令中添加 -l 5000