问题是在构建应用程序之后存在容器,并且无法再扫描它。除了Nginx以外,我还可以使用哪种生产方法,我在Docker-Compose中使用了哪种生产方法,并且它也可以代理到后端。 我想到的一种解决方案是使用小型HTTP服务器服务构建文件,然后使用NGINX将其逆转代理,但我不知道这是否是生产环境中的好习惯。
watchtower
Compose的普遍期望是,
FROM node:23.7.0-slim AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM node:23.7.0-slim AS serve
WORKDIR /app
RUN npm install -g http-server
COPY --from=build /app/dist /app/dist
EXPOSE 3000
CMD ["http-server", "dist", "-p", "3000"]
是不立即退出的长期运行的事情。 您会设置一项撰写服务,例如,但不是
services:
。
Multi阶段的构建并不总是在Docker中,并且您显示的设置试图通过Compose运行仅构建容器,这是您在旧设置中可能会发现的一个解决方法。 您在第二个示例中显示的多阶段构建 -
npm run start
在较早的阶段,然后将构建的应用程序置于更小的图像中,可以使用它 - 是一种标准方法,如果您确实需要为此运行一个容器,那是一个完全正常的生产准备设置。 (我可能会使用npm run build
RUN npm run build
软件包,但基本上是同一设置。)
COPY
然后,当您的CI系统将新图像推向注册表时,Watchtower会自动将其拉动并重新创建容器。 我还会补充说,此设置中没有
nginx
。 您的代码和库堆栈完全包含在图像中。 特别是对于节点应用程序,
http-server
树周围有一些常见的黑客攻击,但是这些导致代码存储在Docker卷中,这将优先于图像中的内容。 如果您的音量安装在build:
上,并且Watchtower拔出了较新的图像,则可以从卷中获取旧模块树,而不是图像中的更新。 您通常不想要这种行为。