У меня есть приложение со следующими службами:
-
web/
- хранит и запускает веб-сервер на флэке python 3 на порту 5000. Использует sqlite3. -
worker/
- имеет файлindex.js
, который является рабочим для очереди. веб-сервер взаимодействует с этой очередью, используя json API через порт9730
. Рабочий использует redis для хранения. Рабочий также сохраняет данные локально в папкеworker/images/
Теперь этот вопрос касается только worker
.
worker/Dockerfile
FROM node:0.12
WORKDIR /worker
COPY package.json /worker/
RUN npm install
COPY . /worker/
docker-compose.yml
redis:
image: redis
worker:
build: ./worker
command: npm start
ports:
- "9730:9730"
volumes:
- worker/:/worker/
links:
- redis
Когда я запускаю docker-compose build
, все работает так, как ожидалось, и все модули npm устанавливаются в /worker/node_modules
, как я ожидал.
npm WARN package.json [email protected] No README data
> [email protected] install /worker/node_modules/pageres/node_modules/screenshot-stream/node_modules/phantom-bridge/node_modules/phantomjs
> node install.js
<snip>
Но когда я делаю docker-compose up
, я вижу эту ошибку:
worker_1 | Error: Cannot find module 'async'
worker_1 | at Function.Module._resolveFilename (module.js:336:15)
worker_1 | at Function.Module._load (module.js:278:25)
worker_1 | at Module.require (module.js:365:17)
worker_1 | at require (module.js:384:17)
worker_1 | at Object.<anonymous> (/worker/index.js:1:75)
worker_1 | at Module._compile (module.js:460:26)
worker_1 | at Object.Module._extensions..js (module.js:478:10)
worker_1 | at Module.load (module.js:355:32)
worker_1 | at Function.Module._load (module.js:310:12)
worker_1 | at Function.Module.runMain (module.js:501:10)
Оказывается, ни один из модулей не присутствует в /worker/node_modules
(на хосте или в контейнере).
Если на хосте, я npm install
, тогда все работает отлично. Но я не хочу этого делать. Я хочу, чтобы контейнер обрабатывал зависимости.
Что здесь не так?
(Разумеется, все пакеты находятся в package.json
.)