docker 将nodejs服务器和react前端放在同一个目录下是一个好的做法吗?

0qx6xfy6  于 2023-04-05  发布在  Docker
关注(0)|答案(2)|浏览(115)

我需要使用nodejs服务器提供我的React构建文件(构建目录)。由于React被 Package 在Docker中,我的nodejs服务器无法访问/frontend中的构建目录。所以我想的是将我的server.js移动到/frontend中,并为它们提供一个单独的Dockerfile。它将具有类似于CMD ['npm run build', 'node server.js']的内容
这是非法的和不好的做法吗?

eeq64g8w

eeq64g8w1#

要构建Web,您有以下选项:
古老的巨石
这是实现web的第一种方式。所有内容都在服务器中:前端和后端。前端(html)在服务器中动态创建,并在每次请求时发送到浏览器。
在这类应用中:

  • 只需要一个git仓库
  • 开发REST控制器暴露JSON是不必要的,因为使用html模板,数据被合并到html。这称为SSR
  • 用Python取代Javascript
  • Django Asyc Views是 AJAX 的替代品吗?
  • Razor Pages饰演PWA
  • 将数据合并到html中不需要javascript

这里有一些语言及其框架

  • java:jsp,jsf,thymeleaf,zk等
  • nodejs:ejs,handlebars
  • c#:razor
  • php:wordpress,drupal,etc
  • ruby:几乎所有框架
  • Python:Django,flask,etc

不是你的情况,但我看到这样的流动:

  • git仓库中一个名为frontend的文件夹,里面有react、angular、vue等
  • 执行此文件夹的构建:npm run build。通常由人来执行。
  • 将构建结果(index.html,js,css等)复制到同一git仓库中的另一个名为server的文件夹中

现代巨石

  • 类似于前面解释的选项,但自动化
  • 现代企业社会责任框架,如:react,angular & vue
  • 大量现成可用的功能,如:登录

如图所示,前端和后端部署在同一台服务器上,位于同一个端口。
如果你正在开发一个带有后端的单一站点,那么可以将前端和后端放在同一个仓库或目录中。这将像现代的巨石一样:mean, mern, mevn,其中一些挑战与在一个存储库中具有不同应用程序类型的事实有关。

多API/微服务的CSR/SPA

适用于:

  • 该公司有几十个领域,每个领域都有复杂的需求,仅用一个Web应用程序无法解决整个公司的问题
  • Web和本地移动的版本需要具有几乎相同的功能
  • 需要系统之间的集成(请求驱动和事件驱动)
  • 解耦和现代身份验证,如IAMs授权流可通过oauth2解决
    如果您是这种情况,我建议您使用分布式或解耦的架构。我的意思是一个应用程序或进程通过存储库/服务器。这里有一些优点:
  • frontend(spa)with react
  • 自己的域名,如acme.com
  • 您可以使用专门的服务来处理静态Web
  • 你不是只绑定到一个API。你可以使用多个api。
  • React开发人员可以有自己的Git策略
  • 自定义构建Web
  • backend(API)with nodejs
  • 自己的域名,如acme.api.com
  • 您可以只扩展后端,因为繁重的进程在这一层
  • nodejs开发人员可以有自己的git策略

服务SPA

如果你的网站很简单,你可以使用

但是如果你的网站有后端这样的复杂性:env变量可移植性,一个构建等,您可以用途:

参考文献

tsm1rwdh

tsm1rwdh2#

您不能(*)在单个容器中运行多个服务器。
不过,对于您的设置,您不需要多个服务器。您可以将React应用程序编译为静态文件,并从其他应用程序中提供这些文件。还有一些更高级的方法,其中服务器在提供这些文件时注入数据或页面的渲染副本;这些不一定能在单独的容器中与React dev服务器一起工作(可能在@JRichardsz的回答中描述的一些设置更多)。
如果两个部分都在同一个仓库中,你可以使用Docker多阶段构建来将前端应用程序编译为静态文件,然后将结果复制到主服务器映像中。这可能看起来像这样:

# Build the frontend.
FROM node:lts AS frontend
WORKDIR /app
COPY frontend/package*.json ./
RUN npm ci
COPY frontend/ ./
RUN npm build
# Built files are left in /app/build; this stage has no CMD.

# Build the main server.
FROM node:lts
WORKDIR /app
COPY server/package*.json ./
RUN npm ci
COPY server/ ./
# Copy the build tree from the frontend image into this one.
COPY --from=frontend /app/build ./static
RUN npm build

# Normal metadata to set up and run the server container.
EXPOSE 3000
CMD ["npm", "run", "start"]

(*)这在技术上是可行的,但您需要安装某种进程管理器,这增加了相当大的复杂性。我在这里描述的方法不太重要,但你也会失去一些东西,比如只看到单个进程的日志的能力,或者只更新系统的一部分而不重新启动其余部分的能力。你建议的CMD不会这样做。我我几乎总是使用多个容器,而不是试图硬塞进像supervisord这样的东西。

相关问题