npm v6.4.1没有在docker中运行`prepare` [英] npm v6.4.1 not running `prepare` inside docker

查看:142
本文介绍了npm v6.4.1没有在docker中运行`prepare`的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆