Docker 无法在主机上创建节点\u模块文件夹并将主机文件夹装载到容器
我的dockerfile将运行npm安装,但是在Docker 无法在主机上创建节点\u模块文件夹并将主机文件夹装载到容器,docker,docker-compose,dockerfile,mount,Docker,Docker Compose,Dockerfile,Mount,我的dockerfile将运行npm安装,但是在docker compose build之后,即使在看到building之后,我的主机文件夹中的文件夹节点\u模块仍然为空。我怎样才能使文件夹也反映在主机上 这是docker-compose.yml: 这是我的码头工人 version: "2" volumes: mongostorage: services: app: build: ./app ports: - "3000" links:
docker compose build
之后,即使在看到building之后,我的主机文件夹中的文件夹节点\u模块仍然为空。我怎样才能使文件夹也反映在主机上
这是docker-compose.yml:
这是我的码头工人
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-compose-up后返回的应用程序容器的docker日志
,错误:
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)
module.js:442
犯错误;
^
错误:找不到模块“dotenv”
在Function.Module.\u解析文件名(Module.js:440:15)
在Function.Module.\u加载(Module.js:388:25)
at Module.require(Module.js:468:17)
根据需要(内部/module.js:20:19)
反对。(/var/www/nodeapp/app.js:3:1)
在模块处编译(Module.js:541:32)
在Object.Module._extensions..js(Module.js:550:10)
在Module.load(Module.js:458:32)
在tryModuleLoad时(module.js:417:12)
在Function.Module.\u加载(Module.js:409:3)
卷指令正在将应用程序目录装载到主机,主机将隐藏您在容器中放入的任何内容。实际上,我很惊讶您看到了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
使用您提供的信息,这对我来说很好。
从包含docker文件的目录中运行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 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应用程序的输出
:
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
从头开始
我相信以下是你的要求,但我不确定这是否是你想要的
您试图解决的实际用例是什么
如果它能够开发您的应用程序,修改本地系统上的文件,并将其反映在docker容器中,那么这并不是实现的方法
我使用了npm模块service
作为保持容器运行的简单方法
我使用了一个命名卷来简化工作。卷数据
在docker compose中定义,并安装在/var/www/app
上
仅供参考,您也可以尝试将原始Dockerfile中的音量指令移至底部,如下所示:
但这仍然只定义容器中的卷装入点,您仍然需要在运行时将其装入主机
应用程序文件:
$ 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 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
现在,您在主机上查找的卷位于docker主机上,该主机作为vm在本地计算机上运行,并且只能从正在运行的容器中访问
我已经采取了以下措施,你可以从中了解更多细节
列出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复制和创建的文件
$ 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
我得到了这个错误:服务“app”构建失败:命令“/bin/sh-c npm install”返回了一个非零代码:238在运行docker compose build之后,您得到了比您没有得到的多得多的代码,包括导致它失败的错误?根据上面的说明,在更新docker文件之后,我犯了这个错误在那之前日志里会有更多的信息。没有这一点,您提供的错误就毫无意义了。我将用我所拥有的更新我的答案。@lecstor卷不会隐藏文件。Docker将在创建时将文件从映像复制到卷。绑定挂载将隐藏文件。您在主机上的何处查找数据<代码>/app/node_modules
?在我的主机上没有创建文件夹节点_modules。我创建了另一个项目来实施您的建议。是否可以在共享的\u文件夹中共享您的解决方案?我将在我的主机上试用它。文件结构都在“App files:”下,下面有详细的步骤说明。它就像在Mac电脑上一样工作,也许在Windows上会有所不同。对不起,我想我没什么可以给你的了。
$ 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