使用卷时,Docker写入主机文件系统的速度很慢.这使得npm install
NodeJS中的任务非常痛苦.我怎样才能 排除的node_modules
文件夹,从体积,使构建速度更快?
众所周知,Docker在macOS上的挂载音量支持非常缓慢(点击此处获取更多信息).对于我们Node开发人员来说,这意味着由于必需的node install
命令,启动应用程序的速度非常慢.嗯,这是一个快速的小窍门来解决那个缓慢的问题.
首先,快速浏览一下这个项目:
uber-cool-microservice示例http://www.fredlackey.com/content/images/2017/01/Screen-Shot-2017-01-17-at-8.23.51-PM.png
简而言之,我将项目的root(./
)中的所有内容映射到容器的一个卷.这允许我在修改文件时使用小部件,比如gulp.watch()
和nodemon
自动重启项目,或者注入任何新代码.
这是实际问题的50%!
因为项目的根被映射到容器内的工作目录,所以调用npm install
原因node_modules
在根目录中创建...实际上是在主机文件系统上.这就是Docker非常缓慢的装载量使得项目在nads中的表现.按原样,一旦发出,您可以花费长达五分钟的时间等待您的项目出现docker-compose up
.
"你的Docker设置一定是错的!"
正如您所看到的,Docker对于这个小项目来说非常普遍.
首先,你们是Dockerfile:
FROM ubuntu:16.04 MAINTAINER "Fred Lackey"RUN mkdir -p /var/www \ && echo '{ "allow_root": true }' > /root/.bowerrc \ && apt-get update \ && apt-get install -y curl git \ && curl -sL https://deb.nodesource.com/setup_6.x | bash - \ && apt-get install -y nodejs \ && npm install -g bower gulp gulp-cli jshint nodemon npm-check-updates VOLUME /var/www EXPOSE 3000
而且,当然,心爱的人docker-compose.yml
:
version: '2' services: uber-cool-microservice: build: context: . container_name: uber-cool-microservice command: bash -c "npm install && nodemon" volumes: - .:/var/www working_dir: /var/www ports: - "3000"
正如你所看到的那样,这个测试项目是精益的,意思是,并按预期工作....除了npm install
是sloooooooooow.
此时,调用npm install
会导致所有项目的依赖项安装到卷中,众所周知,该卷是主机文件系统.这就是疼痛的来源.
"那么你提到的'诀窍'是什么?"
如果只有我们可以从项目的根映射到卷中获益,但不知何故排除 node_modules
并允许它被写入容器内的 Docker的union文件系统.
根据Docker的文档,无法从卷装入中排除文件夹. 哪个,我猜是有道理的.
然而,这是实际上是可能的!
诀窍?简单!一个额外的卷装入!
通过增加一个行到Dockerfile
:
FROM ubuntu:16.04 MAINTAINER "Fred Lackey" RUN mkdir -p /var/www \ && echo '{ "allow_root": true }' > /root/.bowerrc \ && apt-get update \ && apt-get install -y curl git \ && curl -sL https://deb.nodesource.com/setup_6.x | bash - \ && apt-get install -y nodejs \ && npm install -g bower gulp gulp-cli jshint nodemon npm-check-updates VOLUME /var/www VOLUME /var/www/node_modules EXPOSE 3000
...和一个行到docker-compose.yml
文件...
version: '2' services: uber-cool-microservice: build: context: . container_name: uber-cool-microservice command: bash -c "npm install && nodemon" volumes: - .:/var/www - /var/www/node_modules working_dir: /var/www ports: - "3000"
而已!
万一你错过了,我们补充说:
VOLUME /var/www/node_modules
和
- /var/www/node_modules
说什么!?!?
简而言之,额外的卷导致Docker 在容器(文件夹等)中创建内部挂钩并等待它被挂载.由于我们永远不会挂载文件夹,因此我们基本上只是将Docker写入容器中的文件夹.
最终的结果是我们能够挂载我们的项目的根,取像工具的优势gulp.watch()
和nodemon
,一边写的内容node_modules
,以快得多的联合文件系统.
快速注释
node_modules
:
由于某种原因,在使用此技术时,Docker仍将node_modules
在主机文件系统上的项目根目录中创建文件夹.它根本不会写入它.
原文在我的博客上.