볼륨을 사용할 때 Docker가 호스트 파일 시스템에 쓰는 속도가 느립니다. 이것은 NodeJS에서 npm install
같은 작업을 엄청나게 고통스럽게 만듭니다. node_modules
폴더를 볼륨에서 제외하면 어떻게 할 수 있습니까?마운트 된 볼륨을 사용하는 동안 도커 빌드 속도를 높이는 방법
답변
MacOS에서 Docker의 마운트 된 볼륨 지원이 매우 느립니다 (click here for more info). 노드 개발자의 경우 이것은 필요한 node install
명령으로 인해 응용 프로그램을 시작하는 것이 매우 느립니다. 글쎄, 여기저기서 돌아 다니기위한 속임수가있다.
첫째, 프로젝트 얼핏 :
길고도 짧은 이야기, 내가 컨테이너의 볼륨 중 하나에 내 프로젝트의 루트 (./
)의 모든 매핑하고 있습니다. 따라서 파일을 수정할 때마다 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
폴더를 생성합니다. 그것은 단지 에을 쓰지 않을 것입니다.