概述
我们所有人都有至少一个已建立的nodejs应用程序。通常,我们搜索nodejs dockerfile yarn
并将第一个结果添加到我们的存储库中。
但是这些dockerfiles的效果如何?
在本教程中,我将为服务器端nodejs应用程序提供一个示例dockerfile。
在本教程中,我们将讨论如何改善使用纱线软件包管理器的Node.js程序。
问题的背景
通常,npm install
和yarn install
命令安装package.json中列出的所有依赖项中的node_modules文件夹。这包括“依赖关系”以及“ DevDectionencies”。
但是,一旦完成并构建了应用程序,您将不再需要开发依赖项。
因此,npm可以通过prune
命令处理。命令npm prune
通过node_modules并删除未列出为package.json.json。
也是npm prune --production
command中的 - 生产标志告诉Prune仅删除“依赖关系”中的软件包
毕竟,您的生产准备就绪码头图像中没有不必要的开发和测试包。
优化图像的尺寸减小不仅可以改善整体性能,而且可以最大程度地减少存储要求,从而更有效地部署和分发。此外,通过解决未优化图像中的漏洞,优化版本可以增强安全性并降低网络攻击的潜在风险。
问题
如果您决定使用纱线,因为它比NPM快于安装软件包,但也想使用Prune命令,您会注意到Yarn Package Manager没有“ NPM Prune -Prune -Production”的等效命令。但是我们有一个技巧。
优化的Dockerfile
首先,让我们看看完整的Dockerfile。然后我会解释一下。
FROM node:18-alpine AS builder
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn install --frozen-lockfile
COPY . .
RUN yarn run build
RUN yarn install --production --ignore-scripts --prefer-offline --frozen-lockfile
FROM node:18-alpine AS runner
RUN apk add --no-cache tini
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/build ./
COPY --from=builder /app/package.json ./
ENTRYPOINT [ "/sbin/tini", "--" ]
CMD [ "node", "build/server.js" ]
让我们将这个Dockerfile分成几块,并尝试理解它
基本图像
来自节点:18-alpine作为构建器
您应该选择高山版本,以便您的构建图像要比正常版本小。
建筑应用
复制软件包。 运行纱线安装-Frozen-Lockfile
复制 。 。
运行纱线构建
您在这里构建图像。这里的关键是在安装NPM模块时使用Docker的缓存机制。除非您不更改软件包。
构建后修剪开发依赖性
运行纱线安装 - 生产-ignore-scripts-首选 - frozen-lockfile
此命令将在构建图像后修剪Dev依赖项。您已经看到了删除Dev依赖性的优势。
我们不重新安装依赖关系ð
您可以从Dockerfile中看到,在Runner阶段,节点模块没有第二个安装。这缩短了构建时间。
使用Tini
tini是优化node.js应用程序的另一种方法。节点不是处理系统信号或僵尸过程的绝佳工具。例如,如果按Control + C按Control + C,则节点程序将不会停止,因为节点缺少单个处理方法。您可以使用Tini(Init的倒数)解决这些问题。
结论
让我们看看上面提到的一些好处。
我要比较的Docker映像与优化的图像相同,但没有“纱线修剪”命令。
安全
作为结论的一部分,让我们检查获得优化图像的安全检查结果,而不是优化图像:
优化的图像只有10个漏洞。 4个中,6个高。
未优化的图像只有33个漏洞! 13中和20高。
图片大小
也优化的图像的大小小于未优化图像的一半。让我们检查一下: