我的dockerfile将运行npm install,但是在 docker-compose build
之后,即使在看到构建之后,我的主机文件夹中的文件夹node_modules仍然是空的 . 如何获取文件夹并在主机中反映出来?
这是docker-compose.yml:
这是我的docker-compose
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 logs
:
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)
2 回答
开始新鲜..
以下是,我相信,你要求的是什么,但我不确定这是你想要的 .
您尝试解决的实际用例是什么?
如果要开发您的应用程序,修改本地系统上的文件并将它们反映在docker容器中,这不是这样做的方法 .
我使用npm模块
serve
作为保持容器运行的简单方法 .我使用了一个命名卷来简化操作 . 卷
data
在docker-compose中定义并挂载在/var/www/app
上 .fyi,你也可以尝试将原始Dockerfile中的VOLUME指令移到底部,如https://docs.docker.com/engine/reference/builder/#volume:
但这仍然只定义容器中的卷装入点,您仍需要在运行时将其装载到主机上 .
应用文件:
构建应用程序:
打开应用程序
检查应用程序日志
现在,您在主机上查找的卷位于作为本地计算机上的vm运行的docker主机上,并且只能从正在运行的容器中访问 .
我从Inspecting Docker Volumes on a Mac/Windows the Easy Way获取了以下内容,您可以参考以获取更多详细信息 .
列出泊坞窗卷
检查音量以获得它的安装点
启动一个简单的容器,在主机根目录下安装“/ docker”,并列出卷中的文件,这些文件是由Dockerfile复制和创建的文件
VOLUME指令正在将您的app目录挂载到主机上,该主机将隐藏您放在容器上的任何内容 . 我'm actually surprised that you see the node_modules directory. You don'需要
COPY package.json
指令,因为COPY .
应该照顾它 . 请尝试以下Dockerfile ..这对我使用您提供的信息很好 . 从包含Dockerfile的目录运行
docker-compose build
会成功构建映像 .运行构建..
如下所示修改Dockerfile命令我能够运行
docker-compose up app
并查看node_modules目录中安装的所有模块 .输出
docker-compose up app
: