加快NPM在Docker容器中的安装

Ale*_*lls 6 node.js docker dockerfile

我们使用的标准做法是在版本控制中不包括node_modules。但是,在通过CI / CD管道移动时,我们必须在多个位置重新安装NPM依赖项,这会使一切变得非常缓慢。

有没有办法以某种方式缓存Docker的NPM依赖关系?我搜索了Google“ docker缓存npm依赖项”,而2014年的第一个匹配项产生了无效链接。

没有其他有价值的东西出现了。

一种解决方案是在版本控制中包括node_modules,但是我认为这将是一个巨大的错误。我认为以某种方式缓存依赖项将是最佳选择。

这是Dockerfile的样子:

FROM node:6

COPY . .  # copy all files, but node_modules does not exist ( => gitignored)

RUN npm install --no-optional --only=production > /dev/null 2>&1
RUN npm install -g bower  > /dev/null 2>&1
RUN bower install --config.interactive=false --allow-root > /dev/null 2>&1

ENTRYPOINT ["/bin/bash", "/root/cdt/run.sh"]
Run Code Online (Sandbox Code Playgroud)

这是一种可能的解决方案,但是我不太清楚它是如何工作的:

=> http://bitjudo.com/blog/2014/03/13/building-efficient-dockerfiles-node-dot-js/

Ale*_*lls 8

这种方法就像魔术一样工作:

https://blog.playmoweb.com/speed-up-your-builds-with-docker-cache-bfed14c051bf

Docker为您提供了一种特殊的缓存方式,显然,最好使用先天的缓存功能。

不能说我完全理解它是如何工作的,但是它确实起作用。

如果您遵循此模式,它将为您工作:

FROM mhart/alpine-node:5.6.0
WORKDIR /src

# Expose the port 3000
EXPOSE 3000

# Set the default command to run when a container starts
CMD ["node", "server.js"]

# Install app dependencies
COPY package.json /src
RUN npm install

# Copy your code in the docker image
COPY . /src
Run Code Online (Sandbox Code Playgroud)

  • 我同意,如果您经常更改 package.json,对任何人都没有帮助 (3认同)
  • 在`COPY package.json / src`指令中,docker检查package.json文件是否已更改。如果已更改,它将重新运行下面的“ RUN”命令。它可以工作,但是如果您经常更改package.json,那就太麻烦了。也许使用共享卷可能会更快地安装模块 (2认同)

Jam*_*sed 6

您是否尝试过使用yarn而不是npm,这样速度更快?Yarn 并行安装包

https://yarnpkg.com/lang/en/compare/

  • 值得一提的是,新的 *npm 5* 速度更快或与 *yarn* 相当。由于 Yarn 必须安装在 docker 中,因此使用 Node 版本 8+ 可能会很有用,它预装了 npm 5。 (5认同)

Ale*_*erB 5

收集的其他技巧:
方括号中是我的情况下节省的相对时间

RUN mkdir node_modules
Run Code Online (Sandbox Code Playgroud)
  • 跳过 docker 上的安全审核。[-30秒]
RUN npm ci --no-audit
Run Code Online (Sandbox Code Playgroud)
  • 使用 pnpm 等其他包管理器,即使进行额外安装,速度仍然更快。
RUN npm install -g pnpm
RUN pnpm install
Run Code Online (Sandbox Code Playgroud)