web-dev-qa-db-fra.com

Jenkins + Docker: comment contrôler l'utilisateur docker lors de l'utilisation de la commande Image.inside

Chère communauté Stackoverflow,

J'essaie de configurer un pipeline Jenkins CI en utilisant des images Docker comme conteneurs pour mes processus de construction. Je définis un Jenkinsfile pour avoir un pipeline de construction comme code. Je fais quelque chose comme ça:

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 "..."
        }
      }
  }
}

Malheureusement, je tombe sur un comportement étrange du plug-in de pipeline Docker. Dans la sortie du build, je peux voir que la commande Image.inside (...) déclenche le conteneur avec un

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

Cela fait échouer ma génération, car l'utilisateur défini dans le Dockerfile n'a pas l'UID 1000 ... un autre utilisateur est réellement pris. J'ai même essayé de spécifier quel utilisateur utiliser dans le fichier Jenkins

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 "..."
        }
      }
  }
}

mais cela conduit à un commutateur -u en double dans la commande runer runer résultante

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

et évidemment, seul le premier -u est appliqué car ma version échoue toujours. J'ai également fait le débogage en utilisant whoami pour valider mes hypothèses.

Alors mes questions: comment puis-je changer ce comportement? Existe-t-il un commutateur permettant de désactiver le -u 1000: 1000? Est-ce même un bug? J'aime réellement travailler avec le plugin Docker car il simplifie l'utilisation d'un propre registre docker avec des informations d'identification conservées dans Jenkins. Cependant, existe-t-il un autre moyen simple d'atteindre mon objectif si le plug-in Docker n'est pas utilisable?

Merci d'avance pour votre temps

19
RoK

Comme vous pouvez le voir ici ou ici est codé en dur le fait d'ajouter l'uid et le gid de l'utilisateur qui exécute Jenkins (dans votre cas, l'utilisateur Jenkins créé à l'intérieur de l'official image Docker).

Vous pouvez changer l'utilisateur qui exécute les processus à l'intérieur de votre image Jenkins en passant l'argument --user (ou -u) à docker run commande. Cela peut peut-être minimiser vos problèmes.

Modifié

comment puis-je changer ce comportement? Existe-t-il un commutateur permettant de désactiver le -u 1000: 1000?

Vous ne pouvez pas modifier ce comportement dans la version actuelle car le whoami est codé en dur.

Est-ce même un bug?

Dans this pull request semble qu'ils y travaillent.

Cependant, existe-t-il un autre moyen simple d'atteindre mon objectif si le plug-in Docker n'est pas utilisable?

La nouvelle version du plugin de pipeline fournie avec Jenkins utilise également le plugin docker-workflow pour exécuter les conteneurs. Je ne connais pas d'autre plugin pour l'exécuter de manière simple. Pour contourner cela, vous pouvez exécuter votre Jenkins en tant que root, mais c'est une solution très laide.

8
z0beat

J'ai trouvé que vous pouvez réellement changer d'utilisateur en ajoutant args comme suit. Bien que -u 1000: 1000 sera toujours là dans le docker run, vous aurez un -u [votre utilisateur] supplémentaire après 1000: 1000. Docker utilisera acutally le dernier paramètre -u

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