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 builtnode_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模块全球(/博客以外),然后当您运行容器,它应该只是工作。