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

时间:2018-06-17 04:51:07

标签: linux docker root sudo chown

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

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

一个简单的2行Dockerfile将产生同样的问题:

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

并且它也因这个3行Dockerfile的错误而失败:

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帮助论坛。

1 个答案:

答案 0 :(得分:2)

似乎npm install对任何人都执行了setuidsetgid。因此,基本上在运行postinstall脚本之前,它会将用户更改为nobody - 用户当然无权写入/ root。

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

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

之后它使用了docker-example。