10

Bitbucket Pipelinesは Docker コンテナを使用してタスクを実行し、デフォルトで Docker コンテナはルートとして実行されます。これは、NPM のライフサイクル スクリプトの問題です。これは、NPM がスクリプトを実行するときに権限をダウングレードしようとするためです。

postinstallスクリプトを実行すると、 NPM はエラーをスローしますcannot run in wd %s %s (wd=%s)。最も簡単な解決策は、フラグを指定して npm install を実行する--unsafe-permことですが、私はこのアプローチが好きではありません。

Dockerfile を作成するための Docker のベスト プラクティスでは、次のように述べられています。

権限なしでサービスを実行できる場合は、USER を使用して root 以外のユーザーに変更します。

一般的な Docker コンテナーを構成するときは、新しい非 root ユーザーを作成し、このユーザーとして npm スクリプトを実行します。

Pipelines のドキュメントを読んだ後、Docker の USER コマンドに相当するものが見つかりませんでした。andを使用できるかもしれませんが(まだテストしていません)、もっと簡単な解決策はありますか?useraddchownsu

残念ながら、スクリプト セクションuseraddに ,chownsuを追加すると、パイプラインが壊れ、 Webhook が失敗します。bitbucket-pipelines.ymlrepo: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

パイプラインは次のように応答します

{
  "code": 500,
  "message": "There was an error processing your request. It has been logged (ID <removed>)."
}
4

3 に答える 3

3

この質問で対処することは 2 つあります。


Bitbucket Pipelines で root 以外のユーザーとして実行するには、提案したとおりに実行し、USER Docker コマンドを使用できます。node:6.2 イメージは root 以外のユーザーにはマッピングされないため、そうしたい場合は、次の Dockerfile を使用して新しい Docker イメージを作成できます。

FROM node:6.2

USER foo

受け取った 500 エラーは、次の行での YAML 解析の問題のようです。

- chown -R node: /opt/atlassian/bitbucketci/agent/build

「:」は YAML 形式の特殊文字です。キーと値のペアを示します。これを修正するには、その行の内容を次のように引用符で囲みます。

- "chown -R node: /opt/atlassian/bitbucketci/agent/build"

また、ビルド パスに新しいデフォルトの環境変数を使用することをお勧めします。$BITBUCKET_CLONE_DIR。そのため、代わりに行を次のように変更します

- "chown -R node: $BITBUCKET_CLONE_DIR"
于 2016-10-12T13:37:52.280 に答える
2

ノード イメージはすでにノード ユーザーを作成しているため (少なくとも 6.9 以降) useradd、. チャウンなしでもうまくいくようです。最終的に、私は次のようなスクリプトを作成しました - そしてそれは問題ないようです:

image: node:7

pipelines:
  default:
    - step:
        script:
          - su -s /bin/bash -c "npm install" node
          - su -s /bin/bash -c "npm run build" node
于 2017-01-05T08:07:45.137 に答える
0

私が見つけた最も快適な解決策は、root 以外のユーザー アカウントがイメージにまだ含まれていない場合にのみ作成し、gosuユーティリティを使用して実行するコマンド用に設定することです。

Pipelines のbuildステップは既に on に設定chmod 777されている$BUILD_DIRため、追加chownは必要ありません。

したがって、Bitbucket Pipelines Docker コンテナで root 以外のユーザーに変更できるようにするには、次のことを行う必要があります。

  1. gosu ユーティリティをインストールする追加のシェル スクリプトをリポジトリに追加します (Pipelies 構成のステップとして直接含めることもできます)。
  2. install-gosu.shパイプライン構成の最初のステップとしてスクリプトを呼び出し、
  3. で非ルートユーザーを作成します(最初に既に存在するかどうかを確認します)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

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

これは、他の言語/ユーザー/コマンドに簡単に適応できます。nodeユーザーとnpmコマンドを必要なものに交換するだけです。

nodejsこの方法をpython画像でテストしました。

于 2017-03-23T23:05:55.593 に答える