Docker – 共享卷主机:容器的问题
我试图用docker-compose来运行多个服务(redis,mongo和express app) 。 我想让我的主机“连接”到容器,所以修改文件也会修改容器中的文件。
快速应用程序具有运行npm install
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...
它抱怨说无法find快速模块 。
要检查构build过程是否正确安装了package.json中指定的依赖项 ,使用/ bin / bash入口点运行容器:
docker run -it --rm --entrypoint /bin/bash image_name
在容器中,存在node_modules
文件夹 。 我也可以运行nodemon server/app
并表示应用程序正常运行(当然,缺less来自其他服务的连接)。
这里是快速应用程序的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中定义的卷标是否隐藏了使用node_modules folder
docker-compose built
的node_modules folder
?
在您的Dockerfile中,您正在执行以下操作
ADD ./ /blog
这是把你的本地目录,并添加到/博客的图像,然后oyu安装你的npm包,我假设在同一个/博客目录。
然后在你的docker-compose文件中,你可以这样说:
volumes: - ./:/blog
这是采取/图像中的/博客目录,把它扔掉,并用你的本地目录replace它。 既然你没有在你的本地机器上运行npm install,那么你不会在那里有node_modules目录,所以当你运行这个容器的时候,它不会有expression式,所以你的错误。
为了解决这个问题,你应该把你的npm包存放在/ blog下面的某个地方,也许是全局的,然后你就不用担心这个问题了。
要做到这一点,你会改变你的dockerfile
RUN npm install
至
RUN npm install -g
这将安装您的npm模块全球(/博客以外),然后当您运行容器,它应该只是工作。