2017-01-18 5 views

답변

3

MacOS에서 Docker의 마운트 된 볼륨 지원이 매우 느립니다 (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의 엄청나게 천천히 탑재 된 물량이 NAD에서 프로젝트를 시작하는 곳입니다. 마찬가지로 5 분까지 보내고 docker-compose up을 발행하면 프로젝트가 끝날 때까지 기다릴 수 있습니다.

"귀하의 Docker 설정이 틀립니다!"

당신도 알다시피, Docker는이 릴 프로젝트에서 상당히 바닐라입니다.

첫째, 너희는 '늙은 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 install인 경우를 제외하고는 예상대로 작동합니다. sloooooooooow.

이 시점에서 npm install을 호출하면 모든 프로젝트 종속성이 인 (호스트 파일 시스템)으로 설치됩니다. 이것은 고통이 들어오는 곳입니다.

"당신이 언급 한 '트릭'은 무엇입니까?"

아니라 우리는 볼륨에 매핑 프로젝트의 루트를 가진 혜택을 어떻게 든 node_modules을 제외하고 용기의 내부 부두 노동자의 노조 파일 시스템 에 기록 할 수있는 경우.

Docker 's docs에 따르면 볼륨 탑재 폴더에서 폴더를 제외하면 은 사용할 수 없습니다. 어느 쪽이 당연하다고 생각합니다.

그러나 실제로 입니다.

트릭이란? 단순한! 추가 볼륨 탑재! 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를 속여 컨테이너 안의 폴더에 쓰는 것입니다.

최종 결과는 우리가 훨씬 더 빨리 노조 파일 시스템에 node_modules의 내용을 쓰는 동안, gulp.watch()nodemon 같은 도구를 활용, 우리의 프로젝트의 루트를 마운트 할 수 있습니다.

빠른 주 재 : node_modules : 어떤 이유
는이 기술을 사용하는 동안, 부두 노동자는 여전히 호스트 파일 시스템, 프로젝트의 루트 내에서 node_modules 폴더를 생성합니다. 그것은 단지 을 쓰지 않을 것입니다.

The original article is on my blog.