通过“纱线修剪”优化Dockerfile
#node #docker #yarn #optimize

概述

我们所有人都有至少一个已建立的nodejs应用程序。通常,我们搜索nodejs dockerfile yarn并将第一个结果添加到我们的存储库中。

但是这些dockerfiles的效果如何?

在本教程中,我将为服务器端nodejs应用程序提供一个示例dockerfile。

在本教程中,我们将讨论如何改善使用纱线软件包管理器的Node.js程序。

问题的背景

通常,npm installyarn install命令安装package.json中列出的所有依赖项中的node_modules文件夹。这包括“依赖关系”以及“ DevDectionencies”。

但是,一旦完成并构建了应用程序,您将不再需要开发依赖项。

因此,npm可以通过prune命令处理。命令npm prune通过node_modules并删除未列出为package.json.json。

的任何软件包。

也是npm prune --productioncommand中的 - 生产标志告诉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个高。

Optimized Image Security Scan

未优化的图像只有33个漏洞! 13中和20高。

Not Optimized Image Security Scan

图片大小

也优化的图像的大小小于未优化图像的一半。让我们检查一下:

Docker Image Size Comparison