web-dev-qa-db-ja.com

Jenkinsfile:Dockerコンテナでshステップを実行すると、権限が拒否されました

単純なJenkinsfileを実行できません-例.

pipeline {
    agent { label 'ssh-slave' } 
    stages {
        stage('Shell Test') {
            steps {
                sh 'echo "Hello World"'
            }
        }
    }
}

マスター上のJenkinsのログファイルは、コンテナが正常に開始されたが、ビルドジョブが次のようなメッセージでクラッシュすることを示しています

sh: 1: /home/jenkins/workspace/pipeline@tmp/durable-34c21b81/script.sh: Permission denied

以下に、構成/把握した追加の事項をいくつか示します。

  1. VM RHELでエージェントを実行しています

  2. Docker Plugin を使用して、Jenkinsが別のJenkinsエージェントでコンテナーを起動/管理します

  3. JenkinsプラグインのConnect with sshメソッドを使用してDockerコンテナーを起動し、 jenkinsci/ssh-slave Docker image を使用します

  4. JenkinsはDockerコンテナーでrootユーザーを使用しています(少なくとも/home/jenkins/...内のすべてのファイルはrootとして作成されます)

  5. sleepステップをパイプラインに追加し、docker exec...を実行中のコンテナーに追加する場合、./script.shで実行しようとすると、単純なシェルスクリプトをrootとして実行できません(前にchmod +x script.shで適切なファイルモードを設定した場合)-sh: 1: permission deniedも取得します。しかし、sh script.shを使用すると、スクリプトを実行できます

  6. Dockerコンテナー内のrootユーザーはbashを持っていますが、Jenkinsはshを使用してスクリプトを実行しようとしています。

  7. Dockerプラグインのテンプレート設定でrun privilegedフラグをチェックするかどうかに関係なく、エラーが発生します

すでに試したがうまくいかなかったもの

  1. Dockerコンテナのrootユーザーのログインシェルを/bin/shに変更する

  2. shステップでのシバンの提供、アラ

     sh '' '#!/ bin/sh 
     echo "hello world" 
    ' '' 
    
  3. Jenkinsグローバル構成でShell executorを/bin/shに設定する

  4. DockerfileENTRYPOINTスクリプトを実行せず、最後に/bin/shを実行するように、sshスレーブDockerイメージのbashを変更する

どんな助けでもありがたいです!

9
Michael Lihs

問題は、コンテナの/home/jenkinsnoexecでマウントされたことでした:

$ mount
/dev/mapper/rhel-var on /home/jenkins type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,noquota)

根本的な問題は、基盤となるホストの/varnoexecでマウントされたことでした(/varはすべてのコンテナファイルが存在する場所です...):

$ mount
/dev/mapper/rhel-var on /var type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,noquota)

したがって、この問題の解決策は、ホスト上で/varを実行可能としてマウントすることでした。

Sudo mount -o remount,exec /var

これで問題は解決しました。

1
Michael Lihs