2017-11-08 1 views
4

내 dockerfile은 npm install을 실행하지만 docker-compose build 이후에는 내 호스트 폴더의 node_modules 폴더가 빌드 된 후에도 비어 있습니다. 폴더를 가져 와서 호스트에 반영하는 방법은 무엇입니까?호스트에 node_modules 폴더를 생성하고 컨테이너에 호스트 폴더를 마운트 할 수 없습니다.

이것은 고정 표시기 - compose.yml :

이 내이 앱

FROM node:6.3 

RUN mkdir -p /var/www/app 

WORKDIR /var/www/app 

VOLUME /var/www/app 

COPY . /var/www/app  

COPY package.json /var/www/app 

RUN npm install 

package.json

{ 
    "name": "app", 
    "version": "0.0.0", 
    "private": true, 
    "scripts": { 
    "start": "node app.js" 
    }, 
    "dependencies": { 
    "body-parser": "^1.13.3", 
    "cookie-parser": "~1.3.5", 
    "debug": "~2.2.0", 
    "express": "~4.13.1", 
    "helmet": "^3.0.0", 
    "jade": "~1.11.0", 
    "redis": "^2.6.2", 
    "serve-favicon": "~2.3.0" 
    }, 
    "devDependencies": { 
    "gulp": "^3.9.1", 
    "gulp-autoprefixer": "^3.1.1", 
    "gulp-complexity": "^0.3.2", 
    "gulp-concat": "^2.6.1", 
    "gulp-cssnano": "^2.1.2", 
    "gulp-less": "^3.3.0", 
    "gulp-uglify": "^1.5.4", 
    "gulp-watch": "^4.3.11", 
    "strip-debug": "^1.1.1", 
    "util": "^0.10.3" 
    } 
} 
에서 dockerfile입니다

version: "2" 

volumes: 
    mongostorage: 

services: 
    app: 
    build: ./app 
    ports: 
     - "3000" 
    links: 
     - mongo 
     - redis 
    command: node ./bin/www 
    nginx: 
    build: ./nginx 
    ports: 
     - "80:80" 
    links: 
     - app:app 
    mongo: 
    image: mongo:latest 
    environment: 
     - MONGO_DATA_DIR=/data/db 
    volumes: 
     - mongostorage:/data/db 
    ports: 
     - "27017:27017" 
    redis: 
    image: redis 
    volumes: 
     - ./data/redis/db:/data/db 
    ports: 
     - "6379:6379" 

고정 표시기가-구성입니다

docker-compose up 오류 후 응용 프로그램 컨테이너 반환에 대한: VOLUME 명령을 사용하면 컨테이너에 거기에 넣어 아무것도 숨어있을 것이다 호스트에 앱 디렉토리를 장착되었는지

module.js:442 
    throw err; 
    ^

Error: Cannot find module 'dotenv' 
    at Function.Module._resolveFilename (module.js:440:15) 
    at Function.Module._load (module.js:388:25) 
    at Module.require (module.js:468:17) 
    at require (internal/module.js:20:19) 
    at Object.<anonymous> (/var/www/nodeapp/app.js:3:1) 
    at Module._compile (module.js:541:32) 
    at Object.Module._extensions..js (module.js:550:10) 
    at Module.load (module.js:458:32) 
    at tryModuleLoad (module.js:417:12) 
    at Function.Module._load (module.js:409:3) 
+0

호스트에서 어디에서 찾고 있습니다. 데이터? './app/node_modules'? – Matt

답변

1

. 나는 실제로 node_modules 디렉토리가 있다는 것에 놀랐다. COPY .을 처리해야하므로 COPY package.json 명령어가 필요하지 않습니다. 대신 다음 Dockerfile을 사용해보십시오.

FROM node:6.3 
RUN mkdir -p /var/www/app 
WORKDIR /var/www/app 
COPY . /var/www/app  
RUN npm install 

이 정보는 제공하신 정보를 사용하여 정상적으로 작동합니다. Dockerfile이 들어있는 디렉터리에서 docker-compose build을 실행하면 이미지가 성공적으로 빌드됩니다.

$ tree 
. 
├── app 
│   ├── Dockerfile 
│   └── package.json 
└── docker-compose.yml 

1 directory, 3 files 

$ cat docker-compose.yml 
version: "2" 
services: 
    app: 
    build: ./app 
    ports: 
     - "3000" 
    command: node ./bin/www 

$ cat app/Dockerfile 
FROM node:6.3 
RUN mkdir -p /var/www/app 
WORKDIR /var/www/app 
COPY . /var/www/app 
RUN npm install 

$ cat app/package.json 
{ 
    "name": "app", 
    "version": "0.0.0", 
    "private": true, 
    "scripts": { 
    "start": "node app.js" 
    }, 
    "dependencies": { 
    "body-parser": "^1.13.3", 
    "cookie-parser": "~1.3.5", 
    "debug": "~2.2.0", 
    "express": "~4.13.1", 
    "helmet": "^3.0.0", 
    "jade": "~1.11.0", 
    "redis": "^2.6.2", 
    "serve-favicon": "~2.3.0" 
    }, 
    "devDependencies": { 
    "gulp": "^3.9.1", 
    "gulp-autoprefixer": "^3.1.1", 
    "gulp-complexity": "^0.3.2", 
    "gulp-concat": "^2.6.1", 
    "gulp-cssnano": "^2.1.2", 
    "gulp-less": "^3.3.0", 
    "gulp-uglify": "^1.5.4", 
    "gulp-watch": "^4.3.11", 
    "strip-debug": "^1.1.1", 
    "util": "^0.10.3" 
    } 
} 

빌드를 실행 ..

$ docker-compose build 
Building app 
Step 1/5 : FROM node:6.3 
6.3: Pulling from library/node 
357ea8c3d80b: Pull complete 
... 
646e6da4bf07: Pull complete 
Digest: sha256:cde2bd38dbfec5e6e2981ec7a05056c734148fcd4bff088e143f11b2bafe3b64 
Status: Downloaded newer image for node:6.3 
---> 0d9089853221 
Step 2/5 : RUN mkdir -p /var/www/app 
---> Running in 018dd9b28c57 
---> 18cc43628367 
Removing intermediate container 018dd9b28c57 
Step 3/5 : WORKDIR /var/www/app 
---> b8fa2b1a2624 
Removing intermediate container ba1ad506cab2 
Step 4/5 : COPY . /var/www/app 
---> 3f37c76acdc4 
Step 5/5 : RUN npm install 
---> Running in dd87c26c2546 
npm info it worked if it ends with ok 
npm info using [email protected] 
npm info using [email protected] 
npm info attempt registry request try #1 at 11:39:41 AM 
npm http request GET https://registry.npmjs.org/body-parser 
... 
npm info lifecycle [email protected]~postinstall: [email protected] 
npm info lifecycle [email protected]~preinstall: [email protected] 
npm info linkStuff [email protected] 
npm info lifecycle [email protected]~install: [email protected] 
npm info lifecycle [email protected]~postinstall: [email protected] 
npm info lifecycle [email protected]~prepublish: [email protected] 
[email protected] /var/www/app 
+-- [email protected] 
| +-- [email protected] 
... 
npm WARN optional Skipping failed optional dependency /chokidar/fsevents: 
npm WARN notsup Not compatible with your operating system or architecture: [email protected] 
npm info ok 
---> d1bfc665f54c 
Removing intermediate container dd87c26c2546 
Successfully built d1bfc665f54c 
Successfully tagged so47173020_app:latest 

수행으로 Dockerfile 명령을 수정 내가 docker-compose up app를 실행하고 node_modules 디렉토리에 설치된 모든 모듈을 볼 수 있어요 아래. docker-compose up app

version: "2" 
services: 
    app: 
    build: ./app 
    ports: 
     - "3000" 
    command: ls -la node_modules 

출력 :

Creating so47173020_app_1 ... 
Creating so47173020_app_1 ... done 
Attaching to so47173020_app_1 
app_1 | total 2004 
app_1 | drwxr-xr-x 497 root root 20480 Nov 10 11:40 . 
app_1 | drwxr-xr-x 1 root root 4096 Nov 10 11:40 .. 
app_1 | drwxr-xr-x 2 root root 4096 Nov 10 11:40 .bin 
app_1 | drwxr-xr-x 2 root root 4096 Nov 10 11:40 accepts 
app_1 | drwxr-xr-x 4 root root 4096 Nov 10 11:40 accord 
... 
app_1 | drwxr-xr-x 3 root root 4096 Nov 10 11:40 x-xss-protection 
app_1 | drwxr-xr-x 2 root root 4096 Nov 10 11:40 xtend 
app_1 | drwxr-xr-x 3 root root 4096 Nov 10 11:40 yargs 
so47173020_app_1 exited with code 0 
+0

서비스 'app'을 빌드하지 못했습니다. '/ bin/sh -c npm install'명령이 0이 아닌 코드를 반환했습니다 : 도커 - 작성 빌드를 실행 한 후 238 빌드 – davidlee

+0

너는 그 이상을 가졌습니다. 실패한 오류를 포함하여 당신에게 실패한 것입니까? – lecstor

+0

위와 같이 dockerfile을 업데이트 한 후이 오류가 발생했습니다. – davidlee

2

신선한 시작 ..

다음은 내가 당신을 위해 무엇을 요구, 생각,하지만 난 당신이 원하는 무엇 확실하지 않다.

실제 사용 사례는 무엇입니까? 나는 NPM 모듈 serve을 사용했다

가 로컬 시스템에 파일을 수정하는 앱을 개발 할 수 있도록하고 그들이 이것을 고정 표시기 컨테이너에 반영 한 경우 그것을 할 수있는 방법이 아닙니다 .. 컨테이너를 계속 실행하는 쉬운 방법입니다.

나는 더 쉽게하기 위해 명명 된 볼륨을 사용했습니다. 볼륨 data은 docker-compose에 정의되어 있으며 /var/www/app에 마운트되어 있습니다.참고하시기 바랍니다

, 당신은 또한 https://docs.docker.com/engine/reference/builder/#volume에로 바닥에 원래 Dockerfile에서 VOLUME 명령을 이동 시도 할 수 :

Changing the volume from within the Dockerfile: If any build steps change the data within the volume after it has been declared, those changes will be discarded. 

을하지만 이것은 여전히 ​​볼륨이 컨테이너에 마운트 포인트를 정의합니다, 당신은 여전히 ​​마운트해야 런타임에 호스트에서 실행됩니다.

응용 프로그램 파일 :

$ tree 
. 
├── app 
│   ├── Dockerfile 
│   └── package.json 
└── docker-compose.yml 

1 directory, 3 files 

$ cat app/Dockerfile 
FROM node:6.3 
RUN mkdir -p /var/www/app 
WORKDIR /var/www/app 
COPY . /var/www/app 
RUN npm install 

$ cat app/package.json 
{ 
    "name": "app", 
    "version": "0.0.0", 
    "private": true, 
    "scripts": { 
    "start": "serve" 
    }, 
    "dependencies": { 
    "serve": "*" 
    } 
} 

$ cat docker-compose.yml 
version: "2" 

services: 
    app: 
    build: ./app 
    ports: 
     - "3000" 
    command: npm start 
    volumes: 
     - data:/var/www/app 
volumes: 
    data: 

이 응용 프로그램 빌드 :

$ docker-compose build app 
Building app 
Step 1/5 : FROM node:6.3 
---> 0d9089853221 
Step 2/5 : RUN mkdir -p /var/www/app 
---> Using cache 
---> 18cc43628367 
Step 3/5 : WORKDIR /var/www/app 
---> Using cache 
---> b8fa2b1a2624 
Step 4/5 : COPY . /var/www/app 
---> de38a6c3f784 
Step 5/5 : RUN npm install 
---> Running in 5a035f687de1 
npm info it worked if it ends with ok 
npm info using [email protected] 
npm info using [email protected] 
npm info attempt registry request try #1 at 1:19:21 PM 
npm http request GET https://registry.npmjs.org/serve 
... 
npm info ok 
---> 76b99c707ac1 
Removing intermediate container 5a035f687de1 
Successfully built 76b99c707ac1 
Successfully tagged 47173020_app:latest 

가 응용 프로그램 로그를 확인 응용 프로그램

$ docker-compose up -d app 
Recreating 47173020_app_1 ... 
Recreating 47173020_app_1 ... done 

을 가져와을

$ docker-compose logs app 
Attaching to 47173020_app_1 
app_1 | npm info it worked if it ends with ok 
app_1 | npm info using [email protected] 
app_1 | npm info using [email protected] 
app_1 | npm info lifecycle [email protected]~prestart: [email protected] 
app_1 | npm info lifecycle [email protected]~start: [email protected] 
app_1 | 
app_1 | > [email protected] start /var/www/app 
app_1 | > serve 
app_1 | 
app_1 | serve: Running on port 5000 

이제 호스트에서 찾고있는 볼륨이 로컬 컴퓨터의 VM으로 실행되는 도커 호스트에 있으며 실행중인 컨테이너에서만 액세스 할 수 있습니다.

나는 당신이 세부 사항을 위해 참조 할 수있는 Inspecting Docker Volumes on a Mac/Windows the Easy Way에서 뒤에 오는 것 가지고 갔다.

나열 고정 표시기 볼륨은

$ docker volume ls 
local    47173020_data 

는, 호스트 루트 "/ 고정 표시기"를 탑재하고 파일을 나열하는 간단한 컨테이너를 시작

마운트 지점

$ docker volume inspect 47173020_data 
[ 
    { 
     "CreatedAt": "2017-11-13T13:15:59Z", 
     "Driver": "local", 
     "Labels": null, 
     "Mountpoint": "/var/lib/docker/volumes/47173020_data/_data", 
     "Name": "47173020_data", 
     "Options": {}, 
     "Scope": "local" 
    } 
] 
의 얻을 수있는 볼륨을 검사 Docker 파일에 의해 복사되고 생성 된 볼륨에 있음

$ docker run --rm -it -v /:/docker alpine:edge ls -l /docker/var/lib/docker/volumes/47173020_data/_data 
total 12 
-rw-r--r-- 1 root  root   119 Nov 13 12:30 Dockerfile 
drwxr-xr-x 153 root  root   4096 Nov 13 13:14 node_modules 
-rw-r--r-- 1 root  root   144 Nov 13 13:03 package.json 
+0

내 호스트에 폴더 node_modules이 생성되지 않았습니다. 나는 당신의 제안을 구현할 또 다른 프로젝트를 만들었다. – davidlee

+0

공유 솔루션에서 공유 솔루션을 공유 할 수 있습니까? 나는 내 호스트에서 그것을 시도 할 것입니다 – davidlee

+0

파일 구조는 모두 "App files :"아래에 있으며, 아래에 완전히 문서화 된 단계가 있습니다. Mac에서도 그대로 작동합니다. 어쩌면 Windows에서 어떻게 든 달라질 수 있습니다. 내가 너에게 줄 수있는 다른게 있다고 생각하지 않아. 미안해. – lecstor

관련 문제