使用卷时,Docker写入主机文件系统的速度很慢。这使得NodeJS中的npm install
之类的任务非常痛苦。如何从卷中排除 node_modules
文件夹,以便构建更快?
答案 0 :(得分:7)
众所周知,Docker在macOS上的挂载音量支持速度慢(click here for more info)。对于我们Node开发人员来说,这意味着由于必需的node install
命令,启动应用程序的速度非常慢。好吧,这是一个快速的小技巧,以缓解这种缓慢。
首先,快速浏览一下这个项目:
长话短说,我将项目根目录(./
)中的所有内容映射到容器的其中一个卷。这允许我使用小部件,如gulp.watch()
和nodemon
来自动重启项目,或者每当我修改文件时注入任何新代码。
这是实际问题的50%!
由于项目的 root 正在映射到容器中的工作目录,因此调用npm install
会导致node_modules
创建根...实际上在主机文件系统上。这就是Docker非常缓慢的装载量使得项目在nads中的表现。当您发出docker-compose up
时,您可以花费五分钟等待您的项目启动。
“您的Docker设置必定是错误的!”
正如你所看到的,Docker对于这个lil'项目非常有用。
首先,你们是Dockerfile:
FROM ubuntu:16.04
MAINTAINER "Fred Lackey" <fred.lackey@gmail.com>
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的联合容器内的文件系统。
根据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
文件夹。它根本不会写。