4
votes

Pipeline Jenkins avec docker: exécutez docker en tant qu'utilisateur spécifique (postgresql intégré

Salut la communauté Stack Overflow!

J'ai un projet maven - java qui doit être construit avec des pipelines jenkins. Pour ce faire, j'ai configuré le travail en utilisant l'image docker maven: 3.3.3 . Tout fonctionne, sauf le fait que j'utilise ru.yandex.qatools.embed: postgresql-embedded . Cela fonctionne localement, mais sur jenkins, il se plaint du démarrage de Postgres:

sh: 1: cannot create /var/.../jenkins-log.txt: Permission denied
sh: 1: cannot create /var/.../jenkins-result.txt.tmp: Permission denied
mv: cannot stat ‘/var/.../jenkins-result.txt.tmp’: No such file or directory
touch: cannot touch ‘/var/.../jenkins-log.txt’: Permission denied

Apparemment, Postgres ne permet pas d'être exécuté avec les privilèges de superutilisateur pour des raisons de sécurité.

J'ai essayé de me lancer en tant qu'utilisateur en créant ma propre version de l'image-docker et en ajoutant ce qui suit au DockerFile:

agent {
    docker {
        image 'custom-maven:1'
        args '-u myuser'
    }
}

Et cela fonctionne quand je démarre le image docker du terminal du serveur. Mais en utilisant le pipeline jenkins, whoami imprime toujours 'root', ce qui suggère que Jenkins Pipeline utilise run -u derrière les schémas, ce qui remplacerait le DockerFile?

Mon travail de pipeline est actuellement aussi simple que ceci:

pipeline {
    agent {
        docker {
            image 'custom-maven:1'
        }
    }
    stages {
        stage('Checkout') {
             ...
        }
        stage('Build') {
            steps {
                sh 'whoami'
                sh 'mvn clean install'
            }
        }
    }
}

Donc, ma question: Comment puis-je démarrer cette image docker en tant qu'utilisateur différent? Ou changer d'utilisateur avant d'exécuter mvn clean install ?

MISE À JOUR:

En ajoutant -u myuser en tant qu'args dans le pipeline jenkins, Je me connecte en tant qu'utilisateur correct, mais le travail ne peut pas accéder au fichier jenkins-log (et j'espère que c'est le seul problème). L'utilisateur myuser est ajouté à la racine du groupe, mais cela ne fait aucune différence:

RUN useradd myuser
USER myuser

Et l'erreur:

2019-02-08 09:31:20.366  WARN 140 --- [ost-startStop-1] r.y.q.embed.postgresql.PostgresProcess: Possibly failed to run initdb: 

initdb: cannot be run as root

Please log in (using, e.g., "su") as the (unprivileged) user that will own the server process.

2019-02-08 09:31:40.999 ERROR 140 --- [ost-startStop-1] r.y.q.embed.postgresql.PostgresProcess: Failed to read PID file (File '/var/.../target/database/postmaster.pid' does not exist)

java.io.FileNotFoundException: File '/var/.../target/database/postmaster.pid' does not exist

p >


7 commentaires

Pourquoi ne pas essayer la racine de l'utilisateur dans le docker plutôt que de créer un utilisateur différent?


Il s'exécute par défaut en tant que root. Mais comme mentionné ci-dessus, Postgres ne permet pas de s'exécuter avec les privilèges de superutilisateur pour des raisons de sécurité. Le postgres embarqué s'installe au début des tests, mais il ne peut pas s'installer s'il est exécuté sous root. J'ai besoin d'un utilisateur sans privilèges root


en même temps, y a-t-il un utilisateur postgres créé automatiquement?


Je ne suis pas sûr en fait, mais je suppose qu'il y a ... postgresql-integrated gère l'installation du service postgres via java (au démarrage du serveur) ( github.com/yandex-qatools/postgresql-embedded ), et à l'intérieur de mon propre code en java, une connexion se produit et tout est configuré


Mais pourquoi exécutez-vous pipeline en tant qu'utilisateur root? Ne devrait-il pas idéalement fonctionner en tant qu'utilisateur jenkins et ensuite vous pouvez exécuter une image docker en tant qu'utilisateur jenkins plutôt que de créer un autre utilisateur afin que le pipeline et le conteneur aient le même propriétaire: jenkins?


pipeline est exécuté en tant qu'utilisateur jenkins, mais jenkins démarre une image docker (maven) et se connecte en tant que root. Dans les coulisses, jenkins utilise -u 0: 0 lors de l'exécution du docker. Je peux écraser cela, mais le docker n'a pas d'utilisateur jenkins. Il nécessite également un utilisateur root, sinon j'obtiens les erreurs Permissions refusées


Pouvez-vous joindre Dockerfile ici s'il vous plaît?


3 Réponses :


1
votes

J'ai résolu le problème dans notre cas. Ce que j'ai fait, c'est sudo avant la commande mvn . Gardez à l'esprit que chaque étape sh a son propre shell, vous devez donc faire sudo à chaque étape sh :

sh 'sudo -u <youruser> mvn <clean or whatever> -f <path/to/pomfile.xml>'


0 commentaires

1
votes

@Thomas Stubbe

J'ai presque la même erreur que celle que vous avez mentionnée ci-dessus. J'ai aussi une image qui contient postgresql. Sur le Dockerfile, j'ai créé un utilisateur nommé comme tdv et j'utilise la commande id sur le contrôle du conteneur, l'autorisation tdv était de 1000: 1000. Je peux démarrer le conteneur via le pipeline Jenkins mais il n'a pas réussi à exécuter la commande sh, même si j'ajoute sudo -u tdv pour chaque commande. Avez-vous fait une autre configuration?

Mon script Jenkins Pileline comme suit:

$ docker top f1140072d77c5bed3ce43a5ad2ab3c4be24e8c32cf095e83c3fd01a883e67c4e -eo pid,comm
ERROR: The container started but didn't run the expected command. Please double check your ENTRYPOINT does execute the command passed as docker run argument, as required by official docker images (see https://github.com/docker-library/official-images#consistency for entrypoint consistency requirements).
Alternatively you can force image entrypoint to be disabled by adding option `--entrypoint=''`.
[Pipeline] {
[Pipeline] sh
sh: /opt/test@tmp/durable-081990da/jenkins-log.txt: Permission denied
sh: /opt/test@tmp/durable-081990da/jenkins-result.txt.tmp: Permission denied
touch: cannot touch ‘/opt/test@tmp/durable-081990da/jenkins-log.txt’: Permission denied
mv: cannot stat ‘/opt/test@tmp/durable-081990da/jenkins-result.txt.tmp’: No such file or directory
touch: cannot touch ‘/opt/test@tmp/durable-081990da/jenkins-log.txt’: Permission denied
touch: cannot touch ‘/opt/test@tmp/durable-081990da/jenkins-log.txt’: Permission denied

Après l'exécution du Job, je peux vérifier le démarrage du Container. mais il obtient toujours une erreur comme suit

pipeline{
    agent none
  stages{
    stage('did operation inside container'){
     agent {
        docker{
        image 'tdv/tdv-test:8.2'
        label 'docker_machine'
        customWorkspace "/opt/test"
        registryUrl 'https://xxxx.xxxx.com'
        registryCredentialsId '8269c5cd-321e-4fab-919e-9ddc12b557f3'
        args '-u tdv --name tdv-test -w /opt/test -v /opt/test:/opt/test:rw,z -v /opt/test@tmp:/opt/test@tmp:rw,z -p 9400:9400 -p 9401:9401 -p 9402:9402 -p 9403:9403 -p 9407:9407 -p 9303:9303 --cpus=2.000 -m=4g xxx.xxx.com/tdv/tdv-test:8.2 tdv.server'
      }
    }
       steps{

               sh 'sudo tdv whoami'
               sh 'sudo tdv pwd'
               sh 'sudo tdv echo aaa'

       }

  }
    }
}


0 commentaires

0
votes

Solution

Vous avez actuellement sh 'sudo tdv whoami'

Je pense que vous devriez ajouter le drapeau -u après sudo comme ça: sh 'sudo -u tdv whoami'


0 commentaires