Конвейер Jenkins с docker: запускать docker от имени определенного пользователя (встроенный postgresql - PullRequest
0 голосов
/ 08 февраля 2019

Сообщество Hi Stack Overflow!

У меня есть проект maven - java, который должен быть построен с использованием конвейеров jenkins.Для этого я настроил работу, используя образ докера maven:3.3.3.Все работает, кроме того, что я использую ru.yandex.qatools.embed:postgresql-embedded.Это работает локально, но на jenkins жалуется на запуск Postgres:

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

По-видимому, Postgres не разрешает запускаться с привилегиями суперпользователя по соображениям безопасности.

Я пытался запуститькак пользователь, создав собственную версию docker-образа и добавив в DockerFile следующее:

RUN useradd myuser
USER myuser

И это работает, когда я запускаю образ докера из терминала сервера.Но с помощью конвейера jenkins whoami по-прежнему печатает 'root', что предполагает, что Jenkins Pipeline использует run -u за схемами, что отменяет DockerFile?

Моя конвейерная работа в настоящее время так проста:

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

Итак, мой вопрос: как мне запустить этот образ докера от имени другого пользователя?Или переключите пользователей перед запуском mvn clean install?

ОБНОВЛЕНИЕ:

Добавив -u myuser в качестве аргумента в конвейере jenkins, я войду в систему как правильный пользователь, нотогда задание не может получить доступ к файлу журнала jenkins (и, надеюсь, это единственная проблема).Пользователь myuser добавляется в корень группы, но это не делает различий:

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

И ошибка:

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

1 Ответ

0 голосов
/ 20 февраля 2019

Я решил проблему в нашем случае.То, что я сделал, было sudo перед командой mvn.Имейте в виду, что каждый sh шаг имеет свою собственную оболочку, поэтому вам нужно сделать sudo на каждом sh шаге:

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

Пользователь должен быть создан в Dockerfile.Я создал его без пароля, но я не думаю, что это имеет значение, поскольку вы являетесь пользователем root ...

Вы должны использовать sudo вместо смены пользователя или чего-то еще, поскольку в противном случае вам нужно будет предоставить пароль.

Это далеко не чистый способ ... Я бы посоветовал не связываться с переключением пользователей, если вам действительно не нужно (например, запускать встроенный postgres)

...