我尝试使用 docker-compose运行多项服务(redis,mongo和express app)。我希望我的主机“连接”到容器,因此修改文件也会修改容器中的文件。
运行npm install
的 express应用程序的Dockerfile 。
当我尝试docker-compose up
时,我收到以下错误:
web_1 | [nodemon] 1.9.2
web_1 | [nodemon] to restart at any time, enter `rs`
web_1 | [nodemon] watching: *.*
web_1 | [nodemon] starting `node server/app.js`
web_1 | module.js:328
web_1 | throw err;
web_1 | ^
web_1 |
web_1 | Error: Cannot find module 'express'
web_1 | at Function.Module._resolveFilename (module.js:326:15)
web_1 | at Function.Module._load (module.js:277:25)
web_1 | at Module.require (module.js:354:17)
web_1 | at require (internal/module.js:12:17)
web_1 | at Object.<anonymous> (/blog/server/app.js:5:15)
web_1 | at Module._compile (module.js:410:26)
web_1 | at Object.Module._extensions..js (module.js:417:10)
web_1 | at Module.load (module.js:344:32)
web_1 | at Function.Module._load (module.js:301:12)
web_1 | at Function.Module.runMain (module.js:442:10)
web_1 | [nodemon] app crashed - waiting for file changes before starting...
它抱怨找不到快递模块。
要检查构建过程是否正确安装了package.json 中指定的依赖项,我使用/ bin / bash入口点运行容器:
docker run -it --rm --entrypoint /bin/bash image_name
在容器内部,node_modules
文件夹存在。我也可以运行nodemon server/app
并正确表达app运行(当然,缺少与其他服务的连接)。
这是Express应用程序的`Dockerfile':
FROM node:argon
MAINTAINER xxxxxxxx
# Install globally nodemon
RUN npm install nodemon -g
# Make folder that contains blog
RUN mkdir -p blog
# Set up working directory (from now on we are located inside /blog)
WORKDIR /blog
# Add package
ADD ./package.json /blog
# Install dependencies defined in packaje.json
RUN npm install
# Copy data
ADD ./ /blog
这里是docker-compose.yml
:
version: '2'
services:
db:
image: mongo
ports:
- "27017:27017"
cache:
image: redis
ports:
- "6379:6379"
web:
environment:
NODE_ENV: 'development'
build: .
command: nodemon server/app.js
volumes:
- ./:/blog
ports:
- "8000:8000"
depends_on:
- cache
- db
可能与VOLUMES有关吗?。
在我的本地环境中,我没有node_modules文件夹。我在docker-compose.yml中定义的volumes
标记是否隐藏了使用node_modules folder
构建的docker-compose built
?
答案 0 :(得分:2)
在您的Dockerfile中,您正在执行以下操作
ADD ./ /blog
这是在你的本地目录并添加到/ blog的图像,然后oyu正在安装你的npm包,我假设进入同一个/ blog目录。
然后在你的docker-compose文件中你会说:
volumes:
- ./:/blog
这是将图像中的/ blog目录丢弃并将其替换为本地目录。由于您没有在本地计算机上运行npm install,因此您不会在那里安装node_modules目录,因此当您运行容器时,它不会具有express,因此也不会出现错误。
要解决这个问题,你应该将你的npm软件包存储在/ blog下面的某个地方,也许是全局的,然后你就不用担心这个问题了。
为此,您可以从
更改dockerfileRUN npm install
到
RUN npm install -g
这将全局安装你的npm模块(在/ blog之外),然后当你运行容器时,它应该可以工作。