2016-05-02 14 views
0

Im пытается использовать docker-compose для запуска нескольких сервисов (redis, mongo и express app). Я хочу, чтобы мой хост «подключался» к контейнеру, поэтому изменение файлов также будет изменять файлы в контейнере.Docker - Проблемы с общим объемом хоста: контейнер

Экспресс-приложение имеет файл Dockerfile, который запускает npm install.

Когда я пытаюсь docker-compose up, Im получает следующее сообщение об ошибке:

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, Im работает контейнер с/бен/Баш EntryPoint:

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

Внутри контейнера, node_modules папка существует , Я также могу запустить nodemon server/app и экспресс-приложение работает правильно (конечно, отсутствует соединение с другими службами).

Вот это `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 

Может быть что-то связано с ОБЪЕМОВ?.

В моей локальной среде у меня нет папки node_modules. Является тег volumes, который я определил в файле docker-compose.yml, скрывающем node_modules folder, построенный с помощью docker-compose built ?.

ответ

2

В вашем Dockerfile вы делаете следующее

ADD ./ /blog 

Это принимает локальный каталог и добавление к изображению в/блоге, и ые затем установке своих пакетов НПХ, я полагаю, в том же/блог каталог.

Затем в файл докер-вы говорите создание письмо следующего:

volumes: 
    - ./:/blog 

Это принимает директорию/блог в изображении, выбросить и заменить его в локальном каталоге. Так как вы не запускали npm install на своем локальном компьютере, у вас не было бы каталога node_modules, и поэтому при запуске контейнера он не будет иметь экспресс и, следовательно, вашу ошибку.

Чтобы решить эту проблему, вы должны хранить свои пакеты npm где-то еще, кроме под/blog, возможно, по всему миру, и тогда вам не придется беспокоиться об этой проблеме.

Чтобы сделать это, вы бы изменить dockerfile от

RUN npm install 

в

RUN npm install -g 

Это будет установить модули НПМ во всем мире (за пределами/блога), а затем при запуске контейнера, он должен просто работать.

Смежные вопросы