使用 sudo 安装全局包会在安装后例程中产生权限错误

Installing global package with sudo yields permissions error during postinstall routine

我正在尝试 运行 CircleCI 上的这个命令:

 sudo npm install -g --loglevel=warn @oresoftware/r2g

我收到这个错误:

#!/bin/bash -eo pipefail
sudo npm install -g --loglevel=warn @oresoftware/r2g
/usr/local/bin/r2g -> /usr/local/lib/node_modules/@oresoftware/r2g/cli/r2g.sh
/usr/local/bin/r2g_run -> /usr/local/lib/node_modules/@oresoftware/r2g/cli/r2g_run.sh
/usr/local/bin/r2g_copy_smoke_tester -> /usr/local/lib/node_modules/@oresoftware/r2g/assets/copy_smoke_tester.sh

> @oresoftware/r2g@0.0.132 postinstall /usr/local/lib/node_modules/@oresoftware/r2g
> ./assets/postinstall.sh

mkdir: cannot create directory ‘/root’: Permission denied
could not create directory => '/root/.r2g/temp/project'...
mkdir: cannot create directory ‘/root’: Permission denied
could not create oresoftware/bash dir.
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! @oresoftware/r2g@0.0.132 postinstall: `./assets/postinstall.sh`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the @oresoftware/r2g@0.0.132 postinstall script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2018-06-17T04_41_24_461Z-debug.log
Exited with code 1

这个问题不是 CircleCI 特有的 - 这种情况发生在 Docker 或任何设置错误权限的地方。

我的问题是 - 如果我是 root 用户 - 我的 $HOME 是 /root,当我 运行:

时为什么会出现权限错误
mkdir -p /root/.r2g/temp/project

如您所见,它在第一个目录失败了 - 我无法创建 /root。即使它已经存在,几乎可以肯定,我应该是 root 用户,其中 /root 是我的 $HOME 目录。

有谁知道 Linux 系统上是否有此问题的修复程序?有什么命令可以让我 运行 以 root 身份获得对我自己的主目录的权限吗?

我正在尝试找到一个通用且不强制的解决方案。

我在 npm install 命令之前尝试 运行 宁此:

sudo chown -R $(whoami) $HOME

那没有做任何事情,同样的错误。

一个简单的两行 Docker 文件会产生同样的问题:

FROM node:10
RUN npm install -g @oresoftware/r2g

并且对于这个 3 行 Docker 文件也同样的错误失败:

FROM node:10
RUN apt-get update && apt-get install -y sudo
RUN sudo npm install -g @oresoftware/r2g

这里是 postinstall.sh script.

我已经 cross-posted this question 到 CircleCI 帮助论坛了。

似乎 npm install 对任何人都做了 setuidsetgid。所以基本上在它运行 postinstall 脚本之前,它将用户更改为 nobody - 一个当然没有权限写入 /root 的用户。

要防止这种情况,您可以设置 --unsafe-perm flag to true:

npm install --unsafe-perm=true -g @oresoftware/r2g

之后它与 docker-示例一起工作。