Bitbucket Pipelines正在使用Docker容器来执行任务,默认情况下,Docker容器以root身份运行 . 这是NPM生命周期脚本的问题,因为NPM在运行脚本时尝试降级其权限 .
执行 postinstall
脚本时,NPM throws an error表示 cannot run in wd %s %s (wd=%s)
. 最简单的解决方案是使用 --unsafe-perm
标志运行npm install,但我不喜欢这种方法 .
用于编写Dockerfiles的Docker的best practices声明:
如果服务可以在没有权限的情况下运行,请使用USER更改为非root用户 .
配置典型的Docker容器时,我会创建一个新的非root用户并以此用户身份运行我的npm脚本 .
阅读Pipelines documentation后,我无法't find any equivalent to Docker'的USER命令 . 我或许可以使用useradd,chown和su(还没有测试)但是有一个更简单的解决方案吗?
不幸的是,将 useradd
, chown
和 su
添加到 bitbucket-pipelines.yml
脚本部分会破坏管道并导致失败 repo:push
webhook .
image: node:6.2
pipelines:
default:
- step:
script:
- useradd --user-group --create-home --shell /bin/false node
- chown -R node: /opt/atlassian/bitbucketci/agent/build
- su -s /bin/sh -c "npm install" node
- su -s /bin/sh -c "npm run test:coverage --silent" node
管道响应
{
"code": 500,
"message": "There was an error processing your request. It has been logged (ID <removed>)."
}
3 回答
这个问题要解决两件事 .
要在Bitbucket管道中以非root用户身份运行,您可以完全按照建议操作并使用USER Docker命令 . 节点:6.2映像不映射到非root用户,因此如果您愿意,可以使用以下Dockerfile创建新的Docker映像:
您收到的500错误似乎是YAML在此行解析时遇到的问题:
':'是YAML格式的特殊字符 . 指示键值对 . 为了解决这个问题,请将内容放在引号内的那一行,如下所示:
我还建议您现在使用新的默认环境变量作为构建路径 . $ BITBUCKET_CLONE_DIR . 所以改为换行
由于节点映像已经创建了节点用户(至少在6.9中),因此您不需要
useradd
. 它似乎也没有chown工作 . 最后,我有一个看起来像这样的脚本 - 它看起来很好:我还没有将最舒适的解决方案包含在图像中,并使用gosu实用程序为执行的命令设置它 .
Pipelines的
build
步骤已经在$BUILD_DIR
上设置了chmod 777
,因此不需要额外的chown
.因此,为了能够在Bitbucket Pipelines Docker容器中更改为非root用户,您必须:
将额外的shell脚本添加到安装gosu实用程序的存储库(它也可以作为Pipelies配置中的一个步骤直接包含)
调用
install-gosu.sh
脚本作为Pipelines配置的第一步,用
id -u {user} &>/dev/null || useradd ...
创建一个非root用户(检查它是否已经存在),使用gosu以非root用户身份运行命令 .
install-gosu.sh
bitbucket-pipelines.yml
这可以很容易地适用于其他语言/用户/命令 . 只需将
node
用户和npm
命令交换到您需要的任何内容即可 .我用
nodejs
和python
图像测试了这个方法 .