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 模块,然后当您 运行 容器时,它应该可以正常工作。
我正在尝试将 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 模块,然后当您 运行 容器时,它应该可以正常工作。