这个 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
。
我有一个 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://
您的应用正在侦听端口 3000。因此您需要将要在主机上使用的任何端口映射到端口 3000。如果要使用端口 5000,则应使用 -p 5000:3000
。然后您应该可以在主机上使用 localhost:5000
访问它。
您应该将容器视为独立于主机的机器。因此,当容器说它正在侦听 localhost:3000 时,这意味着容器上下文中的本地主机。不是主持人。
由于这种完全相同的情况,我在工作中遇到了问题。经过几个小时查看我们公司的部署管道后,我发现了罪魁祸首...
服务包。
他们将默认端口从 5000 更改为 3000。
资料来源:serve github releases
因此,为了解决您的问题,我建议在您的 serve
命令中添加 -l 5000
。