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を使用できるかもしれませんが(まだテストしていません)、もっと簡単な解決策はありますか?useradd
chown
su
残念ながら、スクリプト セクションuseradd
に ,chown
とsu
を追加すると、パイプラインが壊れ、 Webhook が失敗します。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
パイプラインは次のように応答します
{
"code": 500,
"message": "There was an error processing your request. It has been logged (ID <removed>)."
}