4

Docker를 사용하여 간단한 node.js 프로젝트의 개발 환경을 만들고 싶습니다. 도커 컨테이너 안에 프로젝트의 종속성 (모두 npm 패키지 임)을 설치하고 싶습니다. (그래서 그들은 내 호스트에 손대지 않을 것입니다.) 볼륨을 사용하여 코드를 마운트하십시오. 따라서 컨테이너는 볼륨을 마운트하는 경로에서 node_modules 폴더를 찾을 수 있어야하지만 호스트에서 볼 수 없습니다. 나는 그것을 실행하는 방법docker에서 npm 의존성 설치 및 볼륨에서 테스트

FROM node:6 


RUN mkdir /code 
COPY package.json /code/package.json 
WORKDIR /code 

RUN npm install 

이는 다음과 같습니다 :

이 내 Dockerfile입니다

docker build --tag my-dev-env . 

docker run --rm --interactive --tty --volume $(pwd):/code my-dev-env npm test 

을 그리고 이것은 내 package.json입니다 :

{ 
    "private": true, 
    "name": "my-project", 
    "version": "0.0.0", 
    "description": "My project", 
    "scripts": { 
     "test": "jasmine" 
    }, 
    "devDependencies": { 
     "jasmine": "2.4" 
    }, 
    "license": "MIT" 
    } 

그것은 실패가 수 있기 때문에 jasmine을 찾을 수 없으므로 실제로 설치하지는 않습니다.

> jasmine 

sh: 1: jasmine: not found 

Docker로 원하는 것을 수행 할 수 있습니까? 또 다른 방법은 패키지를 전 세계적으로 설치하는 것입니다. 나는 또한 쓸데없는 npm install -g을 시도했다.

나는 Docker 버전 1.12.1 (빌드 23cf638)과 함께 데비안에 있습니다.

답변

2

해결 방법은 볼륨의 /code/node_modules을 호스트의 임의의 디렉토리에 바인드 마운트하지 않고 볼륨으로 선언하는 것입니다. 이처럼 :

docker run --rm --interactive --tty --volume /code/node_modules --volume $(pwd):/code my-dev-env npm test 

@JesusRT에 의해 표시된 바와 같이, npm install는 잘하지만 혼자 이미지에 /code의 기존 내용을 미행했다 $(pwd)/code에 결합 장착 작업을했다. 위의 그림과 같이 데이터 볼륨 (이 경우 단지 /code/node_modules)으로 선언하여 컨테이너의 /code에서 원하는 것을 복구 할 수 있습니다.

매우 유사한 문제는 이미 Docker-compose: node_modules not present in a volume after npm install succeeds에서 논의되었습니다.

+0

또한 docker 실행 명령을 yaml 파일에 넣고 docker-compose를 사용하여 실행하십시오. 특히 많은 볼륨이 있고 확실히 여러 컨테이너를 사용하면 –

1

여기서 문제는 /code 폴더를 덮어 쓰는 것입니다.

빌드시에 npm install 명령을 실행하므로 /code 폴더에 node_modules 폴더가 만들어집니다. 문제는 docker run 명령을 실행할 때 /code 폴더에 볼륨을 마운트하는 것이므로이 폴더는 로컬 컴퓨터의 내용으로 덮어 쓰게됩니다.

한 가지 방법은 npm test 명령 앞에 npm install을 수행 할 수 있습니다 :

docker run --rm --interactive --tty my-dev-env npm install && npm test 

또한, 위해 명령 실행에 jasmine 작품을 제대로, 아래에 따를 때 당신이 당신의 package.json을 수정해야합니다 :

"scripts": { 
     "test": "./node_modules/.bin/jasmine" 
    } 
+0

src를 한 레벨 아래로 이동하고 이미지를 마운트 할 때 (-v'pwd'/src :/code/src) 마운트하거나 이미지에서 데이터로 초기화 될 여분의 볼륨을 유지하기 위해 필요한 폴더를 -v/code/node_modules) –

+0

@JesusRT ​​내가 언급 한 접근법은 내가 원하는 바가 아니다. 그리고 npm은 주어진 명령을 실행하기 직전에 npm test를 실행하는 셸의 ./node_modules/.bin을 소스하기 때문에'package.json' 수정은 필요하지 않습니다. 그러나 당신의 진단은 괜찮습니다. 그리고 나는 답을 찾았습니다, 그래서 나는 그것을 게시하고 있습니다. 미안 해요. 아직 당신을 못살게 굴지 않아요.// 고마워! –