2016-08-26 1 views
3

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

Я создал пример того, как воспроизвести это:

. 
├── code 
│   ├── bower.json 
│   ├── Gruntfile.js 
│   └── package.json 
├── docker-compose.yml 
└── frontend.dockerfile 

докер-compose.yml:

version: "2" 
services: 
    frontend: 
    build: 
     context: . 
     dockerfile: frontend.dockerfile 
    ports: 
     - "8585:8000" 
    volumes: 
     - ./code:/srv/frontend 
    command: grunt 

frontend.dockerfile:

FROM node:wheezy 

ADD code /srv/frontend 
WORKDIR /srv/frontend 
RUN npm install -g grunt-cli bower 
RUN npm install 

RUN groupadd -r usergroup && useradd -m -r -g usergroup user 
RUN chown -R user:usergroup /srv/frontend 
USER user 

RUN bower install 

bower.json:

{ 
    "name": "code", 
    "description": "", 
    "main": "index.js", 
    "authors": [ 
    "Mr. No One" 
    ], 
    "license": "ISC", 
    "homepage": "", 
    "ignore": [ 
    "**/.*", 
    "node_modules", 
    "bower_components", 
    "test", 
    "tests" 
    ], 
    "dependencies": { 
    "angular": "^1.5.8" 
    } 
} 

Gruntfile.json:

module.exports = function(grunt) { 
    grunt.initConfig({}); 

    // tasks 
    grunt.registerTask('default', []); 
}; 

package.json:

{ 
    "name": "code", 
    "version": "1.0.0", 
    "description": "", 
    "main": "index.js", 
    "scripts": { 
    "test": "echo \"Error: no test specified\" && exit 1" 
    }, 
    "author": "", 
    "license": "ISC", 
    "devDependencies": { 
    "grunt": "^1.0.1" 
    } 
} 

$ docker-compose up ... installing all dependencies ... после установки, она терпит неудачу, когда пытается бежать команда grunt I spec маньяков в моем docker-compose.yml файл с этой ошибкой:

frontend_1 | grunt-cli: The grunt command line interface (v1.2.0) 
frontend_1 | 
frontend_1 | Fatal error: Unable to find local grunt. 
frontend_1 | 
frontend_1 | If you're seeing this message, grunt hasn't been installed locally to 
frontend_1 | your project. For more information about installing and configuring grunt, 
frontend_1 | please see the Getting Started guide: 
frontend_1 | 
frontend_1 | http://gruntjs.com/getting-started 

package.json действительно включают в себя grunt как зависимость, так что должен быть установлен после RUN npm install.

ответ

3

Делайте docker exec -it <nameofyourcontainer> bash и изучайте node_modules, если хрюканье установлено локально.

Вы установили NODE_ENV в production где-нибудь? Это вызывает npm, чтобы не устанавливать devDepedencies.

+0

выглядит как папка только node_modules у меня есть, '' '/ USR/местные/lib/node_modules''', node_modules и bower_components фактически отсутствуют в папке проекта. '' 'NODE_ENV''' не установлен. – vladimirze

+0

Есть ли ваш 'package.json' в' WORKDIR'? –

+0

Также поместите 'cwd' в вашу' command', чтобы увидеть, где он пытается запустить grunt. –

0

Я думаю, что я нашел причину, почему node_modules и bower_components не созданы in the docs.

Note: If any build steps change the data within the volume after it has been declared, those changes will be discarded.

Пока я не VOLUME заявил в своем dockerfile, у меня есть volumes в моем docker-compose.yml, так что я подозреваю, что эта нота влияет на меня, потому что оба npm install & bower install шагов сборки сделать потрогать данные в объеме.

я удалил те этапы сборки из dockerfile и сделал их вручную после сборки в комплекте:

$ docker-compose build 
$ docker-compose run --rm frontend npm install 
$ docker-compose run --rm frontend bower install 

Однако, я столкнулся с проблемой с разрешениями при выполнении этих команд выше, так как мой недавно созданный пользователь не имеет прав для записи на хост, и я не хотел запускать его как root внутри контейнера (например, он не понравится без -allow-root)

Решение состоит в том, чтобы создать пользователя с тем же UID и GID, что и хост ,

Я обнаружил, что Докер позволяет variable substitution и build arguments это означает, что вы не должны жёстко UID и GID внутри docker-compose.yml, вместо этого, они могут быть взяты из хоста-ENV переменных, как так и могут быть доступны во время сборки.

$ export HOST_UID=$(id -u) 
$ export HOST_GID=$(id -g) 

frontend.dockerfile:

FROM node:wheezy 

ARG hostuid 
ARG hostgid 

ADD code /srv/frontend 
WORKDIR /srv/frontend 
RUN npm install -g grunt-cli bower 

RUN groupadd -g "$hostgid" devgroup && useradd -m -u "$hostuid" -g devgroup developer 
RUN chown -R developer:devgroup /srv/frontend 
USER developer 

докер-compose.yml:

version: "2" 
services: 
    frontend: 
    build: 
     context: . 
     dockerfile: frontend.dockerfile 
     args: 
     - hostuid=${HOST_UID} 
     - hostgid=${HOST_GID} 
    ports: 
     - "8585:8000" 
    volumes: 
     - ./code:/srv/frontend 
    command: grunt 

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

  • Нет связанных вопросов^_^