2017-01-18 45 views

回答

3

衆所周知,Docker在macOS上安裝的卷支持緩慢(click here for more info)。對於我們的節點開發人員來說,這意味着啓動您的應用程序非常緩慢,因爲必需的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%!

由於該項目的被映射到容器內工作目錄,調用根......這實際上是主機文件系統上創建npm install原因node_modules。這就是Docker的非常緩慢的安裝量在這個項目中起到的作用。原樣,只要五分鐘等待您的項目出現,一旦你發出docker-compose up

「您的Docker設置必須錯誤!」

正如你所看到的,Docker對於這個lil'項目來說是相當有價值的。

首先,你們「OLE Dockerfile:

FROM ubuntu:16.04 

MAINTAINER "Fred Lackey" <[email protected]> 

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 installslooooooooooooo

在這一點上,呼籲npm install完成全部項目的依賴要安裝的到卷,正如我們都知道,是主機文件系統。這是痛苦來臨的地方。

「那麼你提到的'技巧'是什麼?

如果我們能不必映射到該卷的項目的根目錄中受益,但不知何故排除node_modules並允許被寫入到碼頭工人工會是文件系統容器內。

根據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在容器(文件夾等)中創建內部掛鉤並等待掛載。由於我們是從來沒有掛載文件夾,我們基本上欺騙碼頭進入只是寫入容器內的文件夾。

最終的結果是我們能夠掛載我們的項目的根,利用工具,如gulp.watch()nodemon,一邊寫的node_modules內容到更快的聯合文件系統。

快速注重:node_modules
出於某種原因,在使用這種技術,碼頭工人仍然會項目的根目錄下創建文件夾node_modules,主機文件系統上。它根本不會寫入它。

The original article is on my blog.