web-dev-qa-db-ja.com

Jenkinsパイプライン用のDockerプラグイン-uid1005のユーザーは存在しません

JenkinsパイプラインのDockerコンテナ内からSSHコマンドを実行しようとしています。 CloudBees Docker Pipeline Plugin を使用してコンテナーを起動し、コマンドを実行し、 SSH Agent Plugin を使用してSSHキーを管理しています。これが私のJenkinsfileの基本バージョンです:

node {
  step([$class: 'WsCleanup'])
  docker.image('node').inside {
    stage('SSH') {
      sshagent (credentials: [ 'MY_KEY_UUID' ]) {
        sh "ssh -vvv -o StrictHostKeyChecking=no [email protected] uname -a"
      }
    }
  }
}

SSHコマンドを実行すると、次のエラーが発生します。

+ ssh -vvv -o StrictHostKeyChecking=no [email protected] uname -a
No user exists for uid 1005
12
Nathan Thompson

ログを調べたところ、Docker Pipeline Pluginが、コマンドライン引数としてUIDを渡すことで、ホストにログインしているのと同じユーザーで実行するようにコンテナーに自動的に指示していることがわかりました。

$ docker run -t -d -u 1005:1005 [...]

各環境でcat /etc/passwdを実行して、ホストとコンテナーに存在するユーザーを確認することにしました。案の定、ユーザーのリストはそれぞれ異なっていました。 1005はホストマシンのjenkinsユーザーでしたが、そのUIDはコンテナーに存在しませんでした。この問題を解決するために、スピンするときにホストからコンテナに/etc/passwdをマウントしました。

node {
  step([$class: 'WsCleanup'])
  docker.image('node').inside('-v /etc/passwd:/etc/passwd') {
    stage('SSH') {
      sshagent (credentials: [ 'MY_KEY_UUID' ]) {
        sh "ssh -vvv -o StrictHostKeyChecking=no [email protected] uname -a"
      }
    }
  }
}
16
Nathan Thompson

@ nathan-thompsonが提供するソリューションは素晴らしいですが、私の場合、ホストマシンの/etc/passwdでもユーザーを見つけることができませんでした。これは、passwdファイルをマウントしても問題が解決しなかったことを意味します。この質問 https://superuser.com/questions/580148/users-not-found-in-etc-passwd 一部のユーザーがLDAPなどのIDプロバイダーを使用してホストにログインしていることを示唆しています。

解決策は、コンテナのpasswdファイルに適切な行を追加する方法を見つけることでした。ホストでgetent passwd $USERを呼び出すと、コンテナを実行しているJenkinsユーザーにpasswd行が提供されます。

(Dockerエージェントではなく)ノードで実行されるステップを追加して、行を取得し、ファイルに保存しました。次に、次のステップで、生成されたpasswdをコンテナーにマウントしました。

stages {
    stage('Create passwd') {
        steps {
            sh """echo \$(getent passwd \$USER) > /tmp/tmp_passwd
            """
        }
    }
    stage('Test') {
        agent {
            docker {
                image '*******'
                args '***** -v /tmp/tmp_passwd:/etc/passwd'
                reuseNode true
                registryUrl '*****'
                registryCredentialsId '*****'
            }
        }
        steps {
            sh """ssh -i ********
            """
        }
    }
}
0
hpaknia