Доступ к родительскому демону из контейнера в Jenkins

Проанализируйте проблему

Если вы «должны» использовать регулярное выражение, пропустите проблему, проанализировав принятые перестановки.

«диапазон от -2055 до 2055» может быть выраженный как:

  • необязательный -
  • необязательные начальные нули
  • , за которым следует число от 0 до 2055

«Число от 0 до 2055» может быть одним из конечного числа конкретных перестановок:

  • одна цифра (0-9)
  • две цифры (10- 99)
  • три цифры (100-999)
  • четыре цифры, начинающиеся с 1 (1000-1999)
  • четырехзначных цифр, начиная с 20 (2000-204 * 9)
  • четыре цифры, начинающиеся с 205 (2050-2055 *)

Обратите внимание, что для этого регулярного выражения нет необходимости различать диапазон " 0-9 "и" 1-9 ", и только последние два диапазона имеют какие-либо ограничения на диапазон принятых цифр / символов (обозначенных звездочкой).

Записывать выражения регулярных выражений

. Каждая из вышеуказанных составных частей легко индивидуально выразить как регулярное выражение:

  • -?
  • 0 * [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] 1 [0-9] [0-9] [0-9 ] 20 [0-4] [0-9] 205 [0-5]

Поместите выражения вместе

. Соответствующим выражением для всего совпадения будет:

-?0*([0-9]|[0-9][0-9]|[0-9][0-9][0-9]|1[0-9][0-9][0-9]|20[0-4][0-9]|205[0-5])

Или немного более сжато:

-?0*([0-9]{1,3}|1[0-9]{3}|20[0-4][0-9]|205[0-5])

Предполагая , вход содержит только «число» и ничего больше, поэтому последнее регулярное выражение :

^-?0*([0-9]{1,3}|1[0-9]{3}|20[0-4][0-9]|205[0-5])$

Если необходимо разрешить знак ведущего плюса, это становится:

^[-+]?0*([0-9]{1,3}|1[0-9]{3}|20[0-4][0-9]|205[0-5])$

Вот сценарий js , демонстрирующий, что проходит и что не удастся последнему регулярному выражению.

0
задан hochas 16 January 2019 в 17:26
поделиться

1 ответ

1112 Я думаю, что решил это удовлетворительным образом. Вот пошаговое руководство:

  1. Убедитесь, что докер установлен в контейнере, который должен его запустить
  2. Создайте группу докеров и пользователя jenkins:
CMD DOCKER_GID=$(stat -c '%g' /var/run/docker.sock) && \
    groupmod --gid ${DOCKER_GID} ${DOCKER_GROUP} && \
    usermod -a -G ${DOCKER_GROUP} ${JENKINS_USER} && \
    gosu jenkins sh

Важно отметить, что здесь я выбираю идентификатор группы базовой системы, которая запускает Docker. Поскольку я уже установил докер в свой контейнер и группа уже существует, я изменяю существующую группу, чтобы она соответствовала идентификатору группы системы. Наконец, я добавляю пользователя jenkins в группу Docker. Ваша / etc / group должна выглядеть примерно так в контейнере после его запуска:

docker: x: 999: jenkins

  1. В вашем конвейере запустите агент следующим образом: [ 119]
agent {
    docker {
        image 'storemanager-build'
        args '-u root -v /var/run/docker.sock:/var/run/docker.sock'
    }
}

Предоставляя флаг -u root, вы переопределяете пользователя jenkins, который jenkins навязывает вам при использовании декларативного конвейера. Вы должны использовать root для того, чтобы команда CMD работала и могла создавать группу.

Когда образ работает, команда переключится на пользователя jenkins, которому разрешен доступ к базовому сокету unix.

Вот отрывок из моего Jenkinsfile:

pipeline {

    agent {
        docker {
            image 'build-image'
            args '-u root -v /var/run/docker.sock:/var/run/docker.sock'
        }
    }

    stages {

        stage('Build jar') {
            steps {
                dir("${WORKING_DIRECTORY}") {
                    script {
                        if (isUnix()) {
                            sh './mvnw --batch-mode clean install'
                        } else {
                            bat 'mvnw.cmd --batch-mode clean install'
                        }
                    }
                }
            }
        }

        stage('Build and push image(s)') {
            steps {
                dir("${WORKING_DIRECTORY}") {
                    script {
                        amd64image = docker.build("${IMAGE_NAME}", "-f ./Dockerfile.amd64 .")
                        arm32v7image = docker.build("${IMAGE_NAME}", "-f ./Dockerfile.arm32v7 .")
                    }
                    script {
                        docker.withRegistry("${DOCKER_REGISTRY_URL}", "${STOREMANAGER_REPOSITORY_CREDENTIALS}") {
                            amd64image.push("${BUILD_NUMBER}-amd64")
                            arm32v7image.push("${BUILD_NUMBER}-arm32v7")
                        }
                    }
                }
            }
        }
    }

    post {
        always {
            sh "chmod -R 777 ." // Jenkins can't clean built resources without this as we run the container as root
            cleanWs()
        }
    }
}

И ресурсы, которые мне помогли:

https://jpetazzo.github.io/2015/09/03 / do-not-use-docker-in-docker-for-ci / https://github.com/jenkinsci/docker/issues/196

Надеюсь, это поможет .

0
ответ дан hochas 16 January 2019 в 17:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: