我正在尝试使用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
之后安装。
答案 0 :(得分:3)
如果本地安装了grunt,请执行docker exec -it <nameofyourcontainer> bash
并查看node_modules
。
您是否在某处将NODE_ENV
设置为production
?
这会导致npm
无法安装devDepedencies
。
答案 1 :(得分:1)
我想我找到了node_modules
和bower_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 substitution和build 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