Docker - 共享量问题 host:container

Docker - Issues sharing volume host:container

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

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...

它抱怨它找不到快速模块

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

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

在容器内,存在 node_modules 个文件夹。我还可以 运行 nodemon server/app 并正确表达应用程序 运行s(当然缺少来自其他服务的连接)。

这是 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

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

ADD ./ /blog

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

然后在您的 docker-compose 文件中输入以下内容:

  volumes:
  - ./:/blog

这是将您图像中的 /blog 目录丢弃并替换为您的本地目录。因为你没有 运行 npm install 在你的本地机器上,你不会在那里有 node_modules 目录,所以当你 运行 容器时,它不会有 express,因此你的错误。

要解决这个问题,您应该将您的 npm 包存储在 /blog 下以外的其他地方,也许是全局的,这样您就不必担心这个问题了。

为此,您需要将 docker 文件从

RUN npm install

RUN npm install -g

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