有没有一种简单的方法可以在Bitbucket Pipelines Docker容器中更改为非root用户?

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,chownsubitbucket-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)

Jak*_*iec 1

我发现的最舒适的解决方案是仅在映像中尚未包含非 root 用户帐户时创建一个非 root 用户帐户,并使用gosu实用程序将其设置为执行的命令。

管道的build步骤已经设置,所以不需要chmod 777额外的。$BUILD_DIRchown

因此,为了能够在 Bitbucket Pipelines Docker 容器中更改为非 root 用户,您必须:

  1. 添加一个额外的 shell 脚本到您的存储库来安装 gosu 实用程序(它也可以直接作为 Pipelies 配置中的一个步骤包含在内)
  2. 调用install-gosu.sh脚本作为管道配置的第一步,
  3. 创建一个非root用户(首先检查它是否已经存在)id -u {user} &>/dev/null || useradd ...
  4. 使用 gosu 以非 root 用户身份运行命令。

安装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