纸飞机的信笺
博客Awesome开源Demos制品库
npmuse-upgradenpmomnnpmdocker-depsnpmmp-websocket-polyfillnpm@paperplane/cra-template-antdnpm@paperplane/cra-template-muidockerchiskat/baseline-nodedockerchiskat/artalk-go-fulldockerchiskat/docker-logrotatedockerchiskat/acme.sh-deploy-docker

docker-deps

软件包:
npmdocker-deps
源代码:
githubGitHubgiteaGitea
版本:
package version on npm
技术栈:
DockerDocker

docker-deps 可以快速、完整地从任何 Node.js 或前端项目中提取出安装依赖所需求的文件,使得构建 Docker 镜像时 “安装依赖” 这一步能利用 Docker 的 “分层缓存” 机制,从而命中缓存快速完成。

docker-deps 的特色功能:

  • 它支持目前几乎所有的包管理工具(也包括 bun),不会遗漏任何配置文件;
  • 对于 Monorepo 项目,它能在保持目录结构的情况下提取所有(或开发者指定的)子包的依赖配置;
  • 除了 CLI 之外还提供 JS API,都具备完整配置项。

原理简介:

Node.js 项目通过 Dockerfile 构建 Docker 镜像时,安装依赖的步骤往往耗费较长时间;此时可利用 Docker 的 “分层缓存(Layer)” 机制,只要依赖不变,就能复用以前的构建 Layer 缓存,快速完成构建步骤。

而 Layer 缓存的命中与否取决于 Dockerfile 中的命令以及添加到构建中的文件内容是否有变更。 构建命令通常不会修改,但项目代码是几乎每次构建都会有变动的,这便会导致无法命中缓存。

因此,构建步骤需要进行调整:

  • 调整前: ① 添加项目所有文件到镜像内,② 安装依赖;
  • 调整后: ① 仅添加依赖配置,② 安装依赖,③ 添加项目所有文件到镜像内。

原本无法命中缓存的步骤,经调整后,前两步均能命中缓存。 而 docker-deps 便是为了 ① 而设计,它可以快速、完整地提取依赖配置。

以命令行的方式理解这个过程: 调整前:

# ① 添加项目所有文件到镜像内
COPY . <镜像内的工作区>
# ② 安装依赖
RUN  npm i
RUN  npm run build

调整后: 先通过 CI/CD 或是手动运行,启动此工具,以提取依赖配置:

npx -y docker-deps

然后:

# ① 仅添加依赖配置
COPY .docker-deps <镜像内的工作区>
# ② 安装依赖
RUN  npm i
 
# ③ 添加项目所有文件到镜像内
COPY . <镜像内的工作区>
RUN  npm run build

其中第 ① 步不包含项目代码,只包含几个依赖配置文件(例如 package.json、yarn.lock),这些文件不会经常改变,使得第 ① 步可以命中 Layer 缓存,从而使得第 ② 步同样也命中缓存,快速完成依赖安装。