Jak*_*iec 9 continuous-integration bitbucket node.js docker bitbucket-pipelines
Bitbucket Pipelines使用Docker容器来执行任务,默认情况下Docker容器以root身份运行.这是NPM生命周期脚本的问题,因为NPM在运行脚本时尝试降级其权限.
当执行postinstall脚本,NPM抛出一个错误,它cannot run in wd %s %s (wd=%s).最简单的解决方案是使用--unsafe-perm标志运行npm install ,但我不喜欢这种方法.
Docker 编写Dockerfiles 的最佳实践表明:
如果服务可以在没有权限的情况下运行,请使用USER更改为非root用户.
配置典型的Docker容器时,我会创建一个新的非root用户并以此用户身份运行我的npm脚本.
阅读Pipelines文档后,我找不到任何与Docker的USER命令等效的内容.我也许能使用useradd,chown并且su(没有测试尚未),但有一个简单的解决方案?
不幸的是增加useradd,chown而su到bitbucket-pipelines.yml脚本部分管道破裂,并导致失败的repo:push网络挂接.
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
Run Code Online (Sandbox Code Playgroud)
管道响应
{
"code": 500,
"message": "There was an error processing your request. It has been logged (ID <removed>)."
}
Run Code Online (Sandbox Code Playgroud)
我发现的最舒适的解决方案是仅在映像中尚未包含非 root 用户帐户时创建一个非 root 用户帐户,并使用gosu实用程序将其设置为执行的命令。
管道的build步骤已经设置,所以不需要chmod 777额外的。$BUILD_DIRchown
因此,为了能够在 Bitbucket Pipelines Docker 容器中更改为非 root 用户,您必须:
install-gosu.sh脚本作为管道配置的第一步,id -u {user} &>/dev/null || useradd ...,安装gosu.sh
#!/bin/bash
GOSU_VERSION=1.10
GNUPGHOME="$(mktemp -d)"
set -x
apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \
&& dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')" \
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch" \
&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc" \
&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
&& rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \
&& chmod +x /usr/local/bin/gosu \
&& gosu nobody true \
&& apt-get purge -y --auto-remove ca-certificates wget
Run Code Online (Sandbox Code Playgroud)
bitbucket-pipelines.yml
image: node:6
pipelines:
default:
- step:
script:
- bash $BITBUCKET_CLONE_DIR/install-gosu.sh
- id -u node &>/dev/null || useradd --user-group --create-home --shell /bin/false node
- gosu node npm install
- gosu node npm test
Run Code Online (Sandbox Code Playgroud)
这可以很容易地适应其他语言/用户/命令。只需将node用户和npm命令交换为您需要的任何内容即可。
我已经用图像测试了这种nodejs方法python。
| 归档时间: |
|
| 查看次数: |
1472 次 |
| 最近记录: |