当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在使用已安装的卷时提高Docker构建的速度》经验,为你挑选了1个好方法。

使用卷时,Docker写入主机文件系统的速度很慢.这使得npm installNodeJS中的任务非常痛苦.我怎样才能 排除node_modules文件夹,从体积,使构建速度更快?



1> Fred Lackey..:

众所周知,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 installsloooooooooow.

此时,调用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在主机文件系统上的项目根目录中创建文件夹.它根本不会写入它.

原文在我的博客上.

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有