npm v6.4.1在Docker内未运行`prepare`。

4

我正在尝试在Docker容器内安装一个软件包,但prepare脚本没有被运行。

这里是一个复制出问题的Dockerfile

FROM ubuntu:18.04
# Replace shell with bash so we can source files to use npm
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
RUN apt-get update && apt-get upgrade -y
RUN apt-get install wget git -y
RUN wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
RUN source ~/.nvm/nvm.sh; nvm install v10.12.0; nvm use v10.12.0
RUN mkdir -p /usr/app/
WORKDIR /usr/app/
RUN source ~/.nvm/nvm.sh; npm install jcollard/d3-ng2-service#jcollard/add-dist

上述安装了 nvm 并切换到使用 node v10.12.0npm v6.4.1,然后尝试直接从 GitHub 安装包,但应该会失败。
$ docker build -t npm-hack:latest .
$ docker run --rm -it npm-hack:latest /bin/bash -c 'source ~/.nvm/nvm.sh; npm --version'
6.4.1
$ docker run --rm -it npm-hack:latest /bin/bash -c 'source ~/.nvm/nvm.sh; node --version'
v10.12.0

最后一行docker命令应该失败。
位于存储库分支上的package.json在这里:https://github.com/jcollard/d3-ng2-service/blob/jcollard/add-dist/package.json#L15 您将看到"prepare": "BREAK BREAK BREAK" 当我在docker容器外部运行时,会得到预期的错误。
$ npm install jcollard/d3-ng2-service#jcollard/add-dist
npm ERR! prepareGitDep 1>
npm ERR! prepareGitDep > d3-ng2-service@2.3.0 prepare /home/jcollard/.npm/_cacache/tmp/git-clone-77d32f21
npm ERR! prepareGitDep > BREAK BREAK BREAK
npm ERR! prepareGitDep
npm ERR! prepareGitDep
npm ERR! prepareGitDep 2> npm WARN install Usage of the `--dev` option is deprecated. Use `--only=dev` instead.
npm ERR! prepareGitDep sh: 1: BREAK: not found
npm ERR! prepareGitDep npm ERR! file sh
npm ERR! prepareGitDep npm ERR! code ELIFECYCLE
npm ERR! prepareGitDep npm ERR! errno ENOENT
npm ERR! prepareGitDep npm ERR! syscall spawn
npm ERR! prepareGitDep npm ERR! d3-ng2-service@2.3.0 prepare: `BREAK BREAK BREAK`
npm ERR! prepareGitDep npm ERR! spawn ENOENT
npm ERR! prepareGitDep npm ERR!
npm ERR! prepareGitDep npm ERR! Failed at the d3-ng2-service@2.3.0 prepare script.
npm ERR! prepareGitDep npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

我猜测本地有一些配置正在告诉“npm”运行“prepare”,但我似乎找不到它。如果能得到帮助将不胜感激。
谢谢!
1个回答

17

那是一个有趣的兔子洞。这个bug在这里:https://github.com/npm/npm/issues/17346。Prepare不会以root身份运行。你可以将容器作为非root用户运行,但我只是使用了该问题中的修复程序。

我将你的最后一行更改为:

RUN source ~/.nvm/nvm.sh; npm config set unsafe-perm true; npm install jcollard/d3-ng2-service#jcollard/add-dist

现在它如预期般失败。


1
太棒了。感谢您的帮助。在写这篇文章之前,我花了半天时间。最终是哪个谷歌搜索帮助您找到了这个问题?我的大多数搜索都指向了旧版本的 npm,在添加 prepare 之前。 - Joe
1
"linux npm prepare not running" 我差点要放弃了,非常烦人的是它默默地跳过了准备步骤。 - maxm
3
我只是路过报告一下,经过多天的调试,我终于解决了一个问题:在临时的Docker构建容器中,从私有Git代码库获取的软件包没有运行npm install命令。感谢大家! - austinbruch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接