# 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"]
2条答案
按热度按时间eeq64g8w1#
要构建Web,您有以下选项:
古老的巨石
这是实现web的第一种方式。所有内容都在服务器中:前端和后端。前端(html)在服务器中动态创建,并在每次请求时发送到浏览器。
在这类应用中:
这里有一些语言及其框架
不是你的情况,但我看到这样的流动:
npm run build
。通常由人来执行。现代巨石
如图所示,前端和后端部署在同一台服务器上,位于同一个端口。
如果你正在开发一个带有后端的单一站点,那么可以将前端和后端放在同一个仓库或目录中。这将像现代的巨石一样:mean, mern, mevn,其中一些挑战与在一个存储库中具有不同应用程序类型的事实有关。
多API/微服务的CSR/SPA
适用于:
如果您是这种情况,我建议您使用分布式或解耦的架构。我的意思是一个应用程序或进程通过存储库/服务器。这里有一些优点:
服务SPA
如果你的网站很简单,你可以使用
但是如果你的网站有后端这样的复杂性:env变量可移植性,一个构建等,您可以用途:
参考文献
tsm1rwdh2#
您不能(*)在单个容器中运行多个服务器。
不过,对于您的设置,您不需要多个服务器。您可以将React应用程序编译为静态文件,并从其他应用程序中提供这些文件。还有一些更高级的方法,其中服务器在提供这些文件时注入数据或页面的渲染副本;这些不一定能在单独的容器中与React dev服务器一起工作(可能在@JRichardsz的回答中描述的一些设置更多)。
如果两个部分都在同一个仓库中,你可以使用Docker多阶段构建来将前端应用程序编译为静态文件,然后将结果复制到主服务器映像中。这可能看起来像这样:
(*)这在技术上是可行的,但您需要安装某种进程管理器,这增加了相当大的复杂性。我在这里描述的方法不太重要,但你也会失去一些东西,比如只看到单个进程的日志的能力,或者只更新系统的一部分而不重新启动其余部分的能力。你建议的
CMD
不会这样做。我我几乎总是使用多个容器,而不是试图硬塞进像supervisord这样的东西。