Docker - 问题共享卷主机:容器

时间:2016-05-02 19:34:25

标签: docker docker-compose dockerfile

我尝试使用 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

1 个答案:

答案 0 :(得分:2)

在您的Dockerfile中,您正在执行以下操作

ADD ./ /blog

这是在你的本地目录并添加到/ blog的图像,然后oyu正在安装你的npm包,我假设进入同一个/ blog目录。

然后在你的docker-compose文件中你会说:

  volumes:
  - ./:/blog

这是将图像中的/ blog目录丢弃并将其替换为本地目录。由于您没有在本地计算机上运行npm install,因此您不会在那里安装node_modules目录,因此当您运行容器时,它不会具有express,因此也不会出现错误。

要解决这个问题,你应该将你的npm软件包存储在/ blog下面的某个地方,也许是全局的,然后你就不用担心这个问题了。

为此,您可以从

更改dockerfile
RUN npm install

RUN npm install -g

这将全局安装你的npm模块(在/ blog之外),然后当你运行容器时,它应该可以工作。