【问题标题】:Docker - Issues sharing volume host:containerDocker - 共享卷主机的问题:容器
【发布时间】:2016-05-02 19:34:24
【问题描述】:

我正在尝试使用 docker-compose 来运行多个服务(redis、mongo 和 express 应用程序)。我想让我的主机“连接”到容器,所以修改文件也会修改容器中的文件。

express 应用有其 Dockerfile,运行 npm install

当我尝试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...

它抱怨找不到 express 模块

为了检查构建过程是否正确安装了 package.json 中指定的依赖项,我使用 /bin/bash 入口点运行容器:

docker run -it --rm --entrypoint /bin/bash image_name

在容器内,node_modules 文件夹存在。我也可以运行nodemon server/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 标签是否隐藏了使用docker-compose built 构建的node_modules folder?。

【问题讨论】:

    标签: docker docker-compose dockerfile


    【解决方案1】:

    在您的 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      • 2021-07-04
      • 2016-11-26
      • 1970-01-01
      • 2018-01-03
      • 2019-06-03
      • 1970-01-01
      相关资源
      最近更新 更多