在docker中运行grunt时出错:致命错误:无法找到本地grunt

时间:2016-08-26 12:05:14

标签: docker gruntjs

我正在尝试使用docker中的所有依赖项来运行我的项目但是我遇到了grunt依赖项,由于某种原因grunt失败并出现了无法找到本地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文件中指定的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之后安装。

2 个答案:

答案 0 :(得分:3)

如果本地安装了grunt,请执行docker exec -it <nameofyourcontainer> bash并查看node_modules

您是否在某处将NODE_ENV设置为production? 这会导致npm无法安装devDepedencies

答案 1 :(得分:1)

我想我找到了node_modulesbower_components未创建in the docs的原因。

  

注意:如果任何构建步骤在声明后更改了卷中的数据,那么这些更改将被丢弃。

虽然我的dockerfile中没有声明VOLUME,但我的volumes中确实有docker-compose.yml,所以我怀疑这封信会影响我,因为{{1} }&amp; npm install构建步骤会触及卷中的数据。

我从dockerfile中删除了这些构建步骤,并在构建完成后手动完成:

bower install

但是,我在上面运行这些命令时遇到了权限问题,因为我新创建的用户没有写入主机的权限,我不想在容器内以root身份运行(例如bower就不喜欢它没有--allow-root)

解决方案是使用与主机相同的UID和GID创建用户。

我发现docker允许variable substitutionbuild arguments这意味着您不必在$ docker-compose build $ docker-compose run --rm frontend npm install $ docker-compose run --rm frontend bower install 内对UID和GID进行硬编码,而是可以从主机env变量中获取它们像这样,可以在构建过程中访问。

docker-compose.yml

<强> frontend.dockerfile

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

<强>搬运工-compose.yml

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