无法在主机上创buildnode_modules文件夹并将主机文件夹装载到容器

我的dockerfile将运行npm install,但是在docker docker-compose build后,我的主机文件夹中的文件夹node_modules仍然是空的,即使在看到构build之后。 我怎样才能得到文件夹,并反映在主机呢?

这是docker-compose.yml:

这是我的docker写作

 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" 

这是应用程序中的dockerfile

 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" } } 

docker logs为应用程序容器返回后, docker-compose up错误:

 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) 

开始新鲜..

以下是我相信,你在问什么,但我不确定这是你想要的。

你试图解决的实际用例是什么?

如果是能够开发你的应用程序,修改本地系统上的文件,并将它们反映在docker集装箱中,这不是做这件事的方法。

我用npm模块作为保持容器运行的简单方法。

我已经使用了一个命名的卷,使事情变得更容易。 卷data在docker-compose中定义,并挂载在/var/www/app

您也可以尝试将原始Dockerfile中的VOLUME指令移动到底部,如https://docs.docker.com/engine/reference/builder/#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: 

构build应用程序:

 $ 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 npm@3.10.3 npm info using node@v6.3.1 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 npm@3.10.3 app_1 | npm info using node@v6.3.1 app_1 | npm info lifecycle app@0.0.0~prestart: app@0.0.0 app_1 | npm info lifecycle app@0.0.0~start: app@0.0.0 app_1 | app_1 | > app@0.0.0 start /var/www/app app_1 | > serve app_1 | app_1 | serve: Running on port 5000 

现在,您在主机上查找的卷是在本地计算机上以vm身份运行的docker主机上,只能从正在运行的容器访问。

我已经采取了以下检查在Mac / Windows轻松的方式 ,你可以参考更详细的Docker卷 。

列出泊坞窗卷

 $ 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”,并列出由Dockerfile复制并创build的卷中的文件

 $ 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 

该VOLUME指令将您的应用程序目录挂载到主机,这将隐藏任何你放在容器上的东西。 我真的很惊讶,你看到的node_modules目录。 您不需要将COPY package.json指令作为COPY . 应该照顾的。 尝试下面的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成功创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" } } 

运行构build..

 $ 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 npm@3.10.3 npm info using node@v6.3.1 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 util@0.10.3~postinstall: util@0.10.3 npm info lifecycle app@0.0.0~preinstall: app@0.0.0 npm info linkStuff app@0.0.0 npm info lifecycle app@0.0.0~install: app@0.0.0 npm info lifecycle app@0.0.0~postinstall: app@0.0.0 npm info lifecycle app@0.0.0~prepublish: app@0.0.0 app@0.0.0 /var/www/app +-- body-parser@1.18.2 | +-- bytes@3.0.0 ... npm WARN optional Skipping failed optional dependency /chokidar/fsevents: npm WARN notsup Not compatible with your operating system or architecture: fsevents@1.1.2 npm info ok ---> d1bfc665f54c Removing intermediate container dd87c26c2546 Successfully built d1bfc665f54c Successfully tagged so47173020_app:latest 

如下所示修改Dockerfile命令我可以运行docker-compose up app并查看node_modules目录中安装的所有模块。

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

docker-compose up app输出docker-compose up app

 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