【问题标题】:Is this dockerfile set correctly to serve a React.js build on port 5000?这个 dockerfile 是否正确设置为在端口 5000 上提供 React.js 构建?
【发布时间】:2023-04-06 17:20:02
【问题描述】:

我有一个 React.js 应用程序,我已经 dockerized 并且它工作正常,直到昨天出现某种错误,我发现是由于节点版本 17,所以我决定取回 docker 映像的节点版本到 16。一切都很好,但是自从我这样做后,我无法让 docker 映像在指定端口上运行。

这是我的 dockerfile:

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 中看到的所有输出是:

服务! │

││

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

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

当我转到 localhost:3000 时,什么都没有发生,这很好,但它应该在端口 5000 上工作并且它不会在那里运行。知道为什么我不能像以前那样在端口 5000 上运行 docker 映像的构建吗?

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

【问题讨论】:

  • 你不知道应该使用哪个端口服务,输出告诉你它正在使用 3000,所以你没有得到答案吗?
  • 我提到它需要在端口 5000 上并且在 dockerfile 中我 EXPOSE 它到端口 5000 但它不在端口 5000 上运行,这是我想要解决的问题。跨度>
  • EXPOSE 5000 只是元数据,你有什么配置吗?您是否阅读了服务文档以了解可能采用的形式?
  • 还不清楚如果你将任何端口暴露给你正在运行它的主机。
  • 好吧,再一次,输出告诉你它实际上并没有在容器内的端口 3000 上运行,所以这不应该完全令人惊讶。这是自 v13 以来的默认设置:github.com/vercel/serve/commit/…

标签: node.js reactjs docker npm dockerfile


【解决方案1】:

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

服务包。

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

所以,为了解决您的问题,我建议在您的 serve cmd 中添加 -l 5000

【讨论】:

  • 谢谢。经过一段时间的挣扎,我设法弄清楚了这一点。你是对的。
【解决方案2】:

从日志中您可以看到您的应用程序可能正在监听 localhost:3000 上的流量。您的EXPOSE 5000 行不会改变这种行为,但会使 Docker(和其他用户)认为端口 5000 很重要。由于没有任何东西在端口 3000 上监听,显然你应该得到一个“连接被拒绝”。你可能想查找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,您应该会看到应用程序的响应。

【讨论】:

  • 是的,我用 docker run -p 5000:5000 运行它,这就是我得到这个结果的时候。
  • 正如我们已经指出的,您的应用程序正在侦听端口 3000。serve --help 的结果是什么?
  • 问题是我的 dockerfile 中的所有内容都可以正常工作。我在端口 5000 上运行它并且它工作。我从来没有遇到过这个问题。我只将我的节点版本更改为 16.10,这给了我错误。是的,默认情况下它在端口 3000 上运行,但是通过构建一个构建然后提供它,我可以像以前一样运行 5000:5000。我的问题是找出为什么我的工作代码不再工作。
  • 您已更改为 16.10 - 您之前使用的是哪个版本,最后一次构建是什么时候?请参阅上面的@jonrsharpe 评论。然后按照我的建议添加参数。
  • 我使用了这个命令node:latest,它会使用最新的17版本。
【解决方案3】:

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

您应该将容器视为与主机分开的机器。因此,当容器说它正在侦听 localhost:3000 时,这意味着容器上下文中的 localhost。不是主机。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    相关资源
    最近更新 更多