web-dev-qa-db-ja.com

Jenkins + Docker:Image.insideコマンドを使用するときにdockerユーザーを制御する方法

Stackoverflowコミュニティ各位、

ビルドプロセスのコンテナーとしてdockerイメージを使用して、Jenkins CIパイプラインをセットアップしようとしています。 Jenkinsfileを定義して、コードとしてビルドパイプラインを作成します。私はこのようなことをしています:

node {
  docker.withRegistry('http://my.registry.com', 'docker-credentials') {     
      def buildimage = docker.image('buildimage:latest');
      buildimage.pull();
      buildimage.inside("")
      {
        stage('Checkout sources') {
          git url: '...', credentialsId: '...'
        }

        stage('Run Build and Publish') {
            sh "..."
        }
      }
  }
}

残念ながら、Dockerパイプラインプラグインの奇妙な動作につまずいています。ビルド出力では、Image.inside(...)コマンドがコンテナをトリガーすることがわかります。

docker run -t -d -u 1000:1000 ...

これにより、Dockerfileで定義されたユーザーにUID 1000がないため、ビルドが失敗します...別のユーザーが実際に使用されます。 Jenkinsfile内で使用するユーザーを指定することも試みました

node {
  docker.withRegistry('http://my.registry.com', 'docker-credentials') {     
      def buildimage = docker.image('buildimage:latest');
      buildimage.pull();
      buildimage.inside("-u otheruser:othergroup")
      {
        stage('Checkout sources') {
          git url: '...', credentialsId: '...'
        }

        stage('Run Build and Publish') {
            sh "..."
        }
      }
  }
}

しかし、これにより、結果のdocker runコマンドで-uスイッチが重複します

docker run -t -d -u 1000:1000 -u otheruser:othergroup ...

ビルドがまだ失敗するため、明らかに最初の-uのみが適用されます。また、whoamiを使用してデバッグを行い、仮定を検証しました。

だから私の質問:どのようにこの動作を変更できますか? -u 1000:1000をオフにできるスイッチはありますか?これはバグですか? Jenkinsで保持されている資格情報を使用して独自のDockerレジストリを簡単に使用できるため、Dockerプラグインを実際に使用したいと思っています。ただし、Dockerプラグインが使用できない場合に目標を達成する別の簡単な方法はありますか?

お時間をいただきありがとうございます

19
RoK

ご覧のとおり、 here または here は、Jenkinsを実行しているユーザーのuidとgidを追加するという事実をハードコーディングしています(あなたの場合、oficial内で作成されたJenkinsユーザードッカー画像)。

Jenkinsイメージ内でプロセスを実行するユーザーを変更して、docker runコマンドに--user(または-u)引数を渡すことができます。たぶんこれはあなたの問題を最小限に抑えることができます。

編集済み

どうすればこの動作を変更できますか? -u 1000:1000をオフにできるスイッチはありますか?

Whoamiはハードコードされているため、実際のバージョンではこの動作を変更できません。

これはバグですか?

this プルリクエストでは、彼らがそれに取り組んでいるようです。

ただし、Dockerプラグインが使用できない場合に目標を達成する別の簡単な方法はありますか?

Jenkinsに付属する新しいパイプラインプラグインバージョンでは、docker-workflow-pluginを使用してコンテナーを実行します。私はそれを簡単な方法で実行する別のプラグインを知りません。これを回避するには、ルートとしてJenkinsを実行できますが、これは非常にいソリューションです。

8
z0beat

次のようにargsを追加することで、実際にユーザーを変更できることがわかりました。 -u 1000:1000はdocker run、1000:1000の後に-u [ユーザー]を追加します。 Dockerは最新の-uパラメーターを実際に使用します

agent {
  docker {
    image 'your image'
    args '-u root --privileged'
  }
}
11
Steven Shi