web-dev-qa-db-fra.com

Jenkinsfile: permission refusée lors de l'exécution de sh step dans le conteneur Docker

J'ai de la difficulté à exécuter une simple Jenkinsfile - par exemple.

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

Les fichiers journaux de Jenkins sur le maître indiquent que le conteneur a été démarré avec succès, mais que le travail de construction se bloque avec le message suivant:

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

Voici quelques éléments supplémentaires que nous avons configurés/calculés:

  1. Nous exécutons l'agent sur un VM avec RHEL

  2. Nous utilisons le Docker Plugin for Jenkins pour démarrer/gérer les conteneurs sur un agent Jenkins distinct

  3. Nous faisons tourner le conteneur Docker en utilisant la méthode Connect with ssh dans le plugin Jenkins et utilisons le jenkinsci/ssh-slave Image Docker

  4. Jenkins utilise l'utilisateur root dans le conteneur Docker (au moins tous les fichiers contenus dans /home/jenkins/... sont créés en tant qu'utilisateur root).

  5. Lorsque nous ajoutons une étape sleep dans le pipeline et docker exec... dans le conteneur en cours d'exécution, nous ne pouvons pas exécuter un simple script Shell en tant que root, si nous essayons de l'exécuter avec ./script.sh (même si nous définissons le fichier approprié mode avec chmod +x script.sh avant) - nous obtenons également sh: 1: permission denied. Mais nous pouvons exécuter le script, si nous utilisons sh script.sh

  6. L'utilisateur root dans le conteneur Docker a une bash - alors que Jenkins tente d'exécuter le script avec sh.

  7. L'erreur se produit que nous vérifiions ou non l'indicateur run privileged dans la configuration du modèle du plugin Docker.

Choses que nous avons déjà essayées mais qui n'ont pas fonctionné

  1. Modification du shell de connexion de l'utilisateur root dans le conteneur Docker en /bin/sh

  2. Fournir un shebang dans l'étape sh, à la 

     sh '' '#!/bin/sh 
     echo "bonjour le monde" 
    '''..

  3. Définition de l'exécuteur de shell sur /bin/sh dans la configuration globale de Jenkins

  4. Changer la Dockerfile de l'image Docker ssh-slave de telle sorte que la ENTRYPOINT n'exécute pas de script bash, mais exécute /bin/sh à la fin

Toute aide est appréciée!

6
Michael Lihs

Le problème était que /home/jenkins dans le conteneur était monté avec noexec:

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

Le problème sous-jacent était que le /var sur l'hôte sous-jacent avait été monté avec noexec (/var est l'endroit où tous les fichiers de conteneur résident ...):

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

La solution à ce problème a donc été de monter /var comme exécutable sur l’hôte via

Sudo mount -o remount,exec /var

cela a résolu le problème pour nous.

1
Michael Lihs