2015-11-12 3 views
4

Я пытаюсь установить код моего рабочего узла с моего хоста в контейнер докеров и запустить его с помощью nodemon, используя docker-compose. Но контейнер, похоже, не может найти nodemon. Примечание. На моем хост-компьютере нет узла или npm.Docker/bin/bash: nodemon: команда не найдена

Вот файлы в корневой папке моего проекта (теста). (Это только черновик)

Dockerfile

FROM surenderthakran/nodejs:v4 
ADD . /test 
WORKDIR /test 
RUN make install 
CMD make run 

Makefile

SHELL:=/bin/bash 
PWD:=$(shell pwd) 
export PATH:= $(PWD)/node_modules/.bin:$(PWD)/bin:$(PATH) 
DOCKER:=$(shell grep docker /proc/1/cgroup) 

install: 
    @echo Running make install...... 
    @npm config set unsafe-perm true 
    @npm install 

run: 
    @echo Running make run...... 
# Check if we are inside docker container 
ifdef DOCKER 
    @echo We are dockerized!! :D 
    @nodemon index.js 
else 
    @nodemon index.js 
endif 

.PHONY: install run 

докер-compose.yml

app: 
    build: . 
    command: make run 
    volumes: 
     - .:/test 
    environment: 
     NODE_ENV: dev 
    ports: 
     - "17883:17883" 
     - "17884:17884" 

package.json

{ 
    "name": "test", 
    "version": "1.0.0", 
    "description": "test", 
    "main": "index.js", 
    "dependencies": { 
    "express": "^4.13.3", 
    "nodemon": "^1.8.0" 
    }, 
    "devDependencies": {}, 
    "scripts": { 
    "test": "echo \"Error: no test specified\" && exit 1" 
    }, 
    "keywords": [ 
    "api", 
    "nodejs", 
    "express" 
    ], 
    "author": "test", 
    "license": "ISC" 
} 

index.js

'use strict'; 

var express = require('express'); 

Я строю свой образ с помощью docker-compose build. Он успешно завершается. Но когда я пытаюсь запустить его с помощью docker-compose up, я получаю:

Creating test_app_1... 
Attaching to test_app_1 
app_1 | Running make run...... 
app_1 | We are dockerized!! :D 
app_1 | /bin/bash: nodemon: command not found 
app_1 | make: *** [run] Error 127 
test_app_1 exited with code 2 
Gracefully stopping... (press Ctrl+C again to force) 

Может кто-нибудь, пожалуйста, совет?

Примечание: Dockerfile для моего основного образа surenderthakran/nodejs:v4 можно найти здесь: https://github.com/surenderthakran/dockerfile_nodejs/blob/master/Dockerfile

+0

Если вы попытаетесь в интерактивном режиме, это сработает? – allprog

+0

@allprog Да, он работает интерактивно –

+1

Звучит как проблема PATH - попробуйте использовать полный путь к nodemon: '/ path/to/nodemon' –

ответ

3

Проблема была решена. Проблема сводилась ко мне, не имея node_modules в установленном объеме.

В принципе, при этом docker-compose build изображения было правильно построить с фактическим кодом быть добавил к изображению и создавая папку node_modules по npm install в корне проекта. Но с docker-compose up код монтировался в корне проекта, и он переопределял ранее добавленный код, включая вновь созданную папку node_modules.

Так как решение я скомпрометировал, чтобы установить nodejs на моем хосте и сделать npm install на моем хосте. Поэтому, когда код, который я монтировал, все еще получил мою папку node_modules в моем корневом каталоге проекта, потому что он также был установлен с моего хоста.

Не очень изящное решение, но поскольку это установка для разработки, я готов к компромиссу. На производстве я бы установил, используя docker build и docker run и не буду использовать nodemon в любом случае.

Если кто-нибудь может предложить мне лучшее решение, я буду благодарен.

Спасибо!

+0

Я не знаком с npm/node, но я думаю, вы можете установить их на другой URL-адрес за пределами корня проекта, используя 'npm install -g', а затем ссылаться на них с помощью' npm link' вместо их установки снова локально? Другой альтернативой может быть установка их на пользовательский путь в контейнере с использованием 'npm config set prefix', а затем иметь символическую ссылку в каталоге проекта, которая указывает'./Node_modules' в этом каталоге. Я думаю, что это будет работать как с добавлением, так и с томами. – dnephin