如何在使用已安装的卷时提高Docker构建的速度

时间:2017-01-18 02:19:18

标签: node.js docker docker-compose docker-volume

使用卷时,Docker写入主机文件系统的速度很慢。这使得NodeJS中的npm install之类的任务非常痛苦。如何从卷中排除 node_modules文件夹,以便构建更快?

1 个答案:

答案 0 :(得分:7)

众所周知,Docker在macOS上的挂载音量支持速度慢(click here for more info)。对于我们Node开发人员来说,这意味着由于必需的node install命令,启动应用程序的速度非常慢。好吧,这是一个快速的小技巧,以缓解这种缓慢。

首先,快速浏览一下这个项目:

uber-cool-microservice example http://www.fredlackey.com/content/images/2017/01/Screen-Shot-2017-01-17-at-8.23.51-PM.png

长话短说,我将项目根目录(./)中的所有内容映射到容器的其中一个卷。这允许我使用小部件,如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文件夹。它根本不会

The original article is on my blog.