npm v6.4.1没有在docker中运行`prepare` [英] npm v6.4.1 not running `prepare` inside docker
问题描述
我正在尝试在Docker容器中安装软件包,但是 prepare
脚本未运行。
这是一个 Dockerfile
,它复制了该问题:
FROM ubuntu :18.04
#用bash替换shell,以便我们可以使用npm
运行rm rm / bin / sh&& ln -s / bin / bash / bin / sh
运行apt-get update&& apt-get升级-y
运行apt-get安装wget git -y
RUN wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
运行源〜/ .nvm / nvm.sh; nvm安装v10.12.0; nvm使用v10.12.0
RUN mkdir -p / usr / app /
WORKDIR / usr / app /
RUN源〜/ .nvm / nvm.sh; npm install jcollard / d3-ng2-service#jcollard / add-dist
以上安装 nvm
并切换为使用 node v10.12.0
和 npm v6.4.1
$ docker build -t npm-hack:latest。
$ 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
您会看到准备: BREAK BREAK BREAK,
当我在docker容器外运行此命令时,将导致预期的错误:
$ npm install jcollard / d3-ng2-service#jcollard / add-dist
npm ERR! prepareGitDep 1>
npm错误! prepareGitDep> d3-ng2-service@2.3.0准备/home/jcollard/.npm/_cacache/tmp/git-clone-77d32f21
npm错误! prepareGitDep> BREAK BREAK BREAK
npm错误! prepareGitDep
npm错误! prepareGitDep
npm错误! prepareGitDep 2> npm WARN install不推荐使用--dev选项。使用`--only = dev`代替。
npm错误! prepareGitDep sh:1:BREAK:找不到
npm错误! prepareGitDep npm错误!文件sh
npm错误! prepareGitDep npm错误!代码ELIFECYCLE
npm错误! prepareGitDep npm错误! errno ENOENT
npm错误! prepareGitDep npm错误! syscall生成
npm错误! prepareGitDep npm错误! d3-ng2-service@2.3.0准备:`BREAK BREAK BREAK`
npm错误! prepareGitDep npm错误!产生ENOENT
npm错误! prepareGitDep npm错误!
npm错误! prepareGitDep npm错误! d3-ng2-service@2.3.0准备脚本失败。
npm错误! prepareGitDep npm错误! npm可能不是问题。上面可能还有其他日志记录输出。
我假设本地有一些配置通知了 npm
运行准备
,但我似乎找不到它。
谢谢!
解决方案一个有趣的兔子洞。就是这个错误: https://github.com/npm/npm/issues/17346。 Prepare不能以root身份运行。您可以以非root用户身份运行容器,但是我只是在问题中使用了此修复程序。
我将您的最后一行更改为此
运行源〜/ .nvm / nvm.sh; npm config set unsafe-perm true; npm install jcollard / d3-ng2-service#jcollard / add-dist
现在,它会按预期失败。
I am trying to install a package inside of a docker container but the prepare
script is not being run.
Here is a Dockerfile
which replicates the issue:
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
The above installs nvm
and switches to using node v10.12.0
and npm v6.4.1
before attempting to install a package directly from github which should fail.
$ 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
The final line of the docker command should fail.
The package.json
located on that repository branch is here: https://github.com/jcollard/d3-ng2-service/blob/jcollard/add-dist/package.json#L15
You'll see "prepare": "BREAK BREAK BREAK",
When I run this outside of the docker container, this results in the expected error:
$ 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.
I'm assuming there is some configuration locally that is informing npm
to run prepare
but I can't seem to find it. Any help would be appreciated.
Thanks!
解决方案 That was an interesting rabbit hole. It is this bug: https://github.com/npm/npm/issues/17346. Prepare doesn't run as root. You could run the container as non-root, but I just used the fix in the issue.
I changed your last line to this
RUN source ~/.nvm/nvm.sh; npm config set unsafe-perm true; npm install jcollard/d3-ng2-service#jcollard/add-dist
Now it fails as expected.
这篇关于npm v6.4.1没有在docker中运行`prepare`的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!