8

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

postinstallスクリプトを実行する場合、NPM throws an errorcannot run in wd %s %s (wd=%s)です。最も簡単な解決策は、--unsafe-permフラグを指定してnpm installを実行することですが、私はこの方法が嫌いです。

サービスが root以外のユーザーに変更するUSERを使用して、権限なしで実行することができた場合:

ドッカーのbest practices Dockerfilesを書くためには、と述べています。

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

Pipelines documentationを読んだ後、DockerのUSERコマンドと同等のものは見つかりませんでした。 useraddchownsu(まだテストしていない)を使用することができますが、より簡単な解決策がありますか?残念ながらbitbucket-pipelines.ymlスクリプトセクションにuseraddchownsuを追加

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 

は、パイプラインは、この質問に対処するには、2つのものがあります

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

答えて

1

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

パイプラインのbuildステップは、既にを$BUILD_DIRに設定していますので、追加のchownは不要です。

だから、あなたが持っているのBitbucketパイプラインドッカーコンテナ内の非rootユーザーに変更できるようにする:

  1. がgosuユーティリティをインストールし、あなたのリポジトリに追加シェルスクリプトを追加します(それも可能id -u {user} &>/dev/null || useradd ...とPipeliesの設定ステップ)
  2. コールパイプラインの設定の最初のステップとしてinstall-gosu.shスクリプト、
  3. 非ルートを作成するユーザ(それが既に第一存在するかどうかをチェックする)、
  4. 使用Gとして直接含まroot以外のユーザーとしてコマンドを実行します。

install-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 

ビットバケット-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コマンドを必要なものに交換するだけです。

私はnodejspythonイメージでこの方法をテストしました。

2

で応答します。 Bitbucketパイプラインでのroot以外のユーザーとして実行するように


、あなたが示唆している正確に何をすべきかとUSERドッカーコマンドを使用することができます。ノード:あなたはあなたが以下のDockerfileで新しいドッカーイメージを作成することができますしたいと思っので、もし6.2画像は、root以外のユーザーにマップされない:あなたは

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。だから、ノードのイメージが既に(少なくとも6.9+で)ノードユーザを作成するので、あなたがuseraddを必要としない代わりに

- "chown -R node: $BITBUCKET_CLONE_DIR" 
+0

質問。私はこの '/ opt/atlassian/bitbucketci/agent/build'への参照を他のPipeLinesの質問で見ています。誰もが、私は生成されたビルドをつかむことができるように実行されているコンテナのエージェント情報を見つけるために知っていますか? –

1

する行を変更します。それはまた、chownなしでうまくいくようです。最後に、私はこのように見ているスクリプトを持っている - そしてうまくように見えます:

image: node:7 

pipelines: 
    default: 
    - step: 
     script: 
      - su -s /bin/bash -c "npm install" node 
      - su -s /bin/bash -c "npm run build" node