Создание образа докера в конвейере Jenkins (в контейнере докера)

Я использую Jenkins из контейнера докеров. И я хочу создать образ докера в конвейере Jenkins, но докера нет в этом контейнере (где Jenkins).

Контейнер Jenkins, развернутый Docker Compose, файл yml:

version: "3.3"
services:
  jenkins:
    image: jenkins:alpine
    ports:
      - 8085:8080
    volumes:
      - ./FOR_JENKINS:/var/jenkins_home

Что мы можем сделать для создания образа докера в конвейере Jenkins? Можем ли мы развернуть какой-нибудь док-контейнер с докером и использовать его один раз для создания образа докера? или что-то другое? Как у тебя дела с ними?

Изменить:

Спасибо @VonC, я проверил вашу информацию, но ... "в разрешении отказано"

Файл Docker Compose:

version: "3.3"
services:
  jenkins:
    image: jenkins:alpine
    ports:
      - 8085:8080
    volumes:
      - ./FOR_JENKINS:/var/jenkins_home
#      - /var/run/docker.sock:/var/run/docker.sock:rw
      - /var/run:/var/run:rw

Jenkinsfile:

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                echo "Compiling..."
                sh "${tool name: 'sbt', type: 'org.jvnet.hudson.plugins.SbtPluginBuilder$SbtInstallation'}/bin/sbt compile"
            }
        }
        /*stage('Unit Test') {
            steps {
                echo "Testing..."
                sh "${tool name: 'sbt', type: 'org.jvnet.hudson.plugins.SbtPluginBuilder$SbtInstallation'}/bin/sbt coverage 'test-only * -- -F 4'"
                sh "${tool name: 'sbt', type: 'org.jvnet.hudson.plugins.SbtPluginBuilder$SbtInstallation'}/bin/sbt coverageReport"
                sh "${tool name: 'sbt', type: 'org.jvnet.hudson.plugins.SbtPluginBuilder$SbtInstallation'}/bin/sbt scalastyle || true"
            }
        }*/
        stage('DockerPublish') {
            steps {
                echo "Docker Stage ..."
                // Generate Jenkinsfile and prepare the artifact files.
                sh "${tool name: 'sbt', type: 'org.jvnet.hudson.plugins.SbtPluginBuilder$SbtInstallation'}/bin/sbt docker:stage"

                echo "Docker Build-2 ..."
                // Run the Docker tool to build the image
                script {
                    docker.withTool('docker') {

                        echo "D1- ..."
                        //withDockerServer([credentialsId: "AWS-Jenkins-Build-Slave", uri: "tcp://192.168.0.29:2376"]) { 
                            echo "D2- ..."
                            sh "printenv" 
                            echo "D3- ..."
                            //sh "docker images" 
                            echo "D4- ..."
                            docker.build('my-app:latest', 'target/docker/stage').inside("--volume=/var/run/docker.sock:/var/run/docker.sock")
                            echo "D5- ..."
                            //base.push("tmp-fromjenkins") 
                        //}

                    }
                }
            }
        }
    }
}

Результат:

[job1] Running shell script

+ docker build -t my-app:latest target/docker/stage

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.29/build?buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&shmsize=0&t=my-app%3Alatest&target=&ulimits=null: dial unix /var/run/docker.sock: connect: permission denied

script returned exit code 1

Изменить: последняя проблема с "отказом в доступе" исправлена:

>>sudo chmod 0777 /var/run/docker.sock

Рабочее состояние:

Позвоните в хост:

>>sudo chmod 0777 /var/run/docker.sock

Файл Docker Compose:

version: "3.3"
services:
  jenkins:
    image: jenkins:alpine
    ports:
      - 8085:8080
    volumes:
      - ./FOR_JENKINS:/var/jenkins_home
#      - /var/run/docker.sock:/var/run/docker.sock:rw
      - /var/run:/var/run:rw

Jenkinsfile:

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                echo "Compiling..."
                sh "${tool name: 'sbt', type: 'org.jvnet.hudson.plugins.SbtPluginBuilder$SbtInstallation'}/bin/sbt compile"
            }
        }
        /*stage('Unit Test') {
            steps {
                echo "Testing..."
                sh "${tool name: 'sbt', type: 'org.jvnet.hudson.plugins.SbtPluginBuilder$SbtInstallation'}/bin/sbt coverage 'test-only * -- -F 4'"
                sh "${tool name: 'sbt', type: 'org.jvnet.hudson.plugins.SbtPluginBuilder$SbtInstallation'}/bin/sbt coverageReport"
                sh "${tool name: 'sbt', type: 'org.jvnet.hudson.plugins.SbtPluginBuilder$SbtInstallation'}/bin/sbt scalastyle || true"
            }
        }*/
        stage('DockerPublish') {
            steps {
                echo "Docker Stage ..."
                // Generate Jenkinsfile and prepare the artifact files.
                sh "${tool name: 'sbt', type: 'org.jvnet.hudson.plugins.SbtPluginBuilder$SbtInstallation'}/bin/sbt docker:stage"

                echo "Docker Build-2 ..."
                // Run the Docker tool to build the image
                script {
                    docker.withTool('docker') {

                        echo "D1- ..."
                        //withDockerServer([credentialsId: "AWS-Jenkins-Build-Slave", uri: "tcp://192.168.0.29:2376"]) { 
                            echo "D2- ..."
                            sh "printenv" 
                            echo "D3- ..."
                            //sh "docker images" 
                            echo "D4- ..."
                            docker.build('my-app:latest', 'target/docker/stage')
                            echo "D5- ..."
                            //base.push("tmp-fromjenkins") 
                        //}

                    }
                }
            }
        }
    }
}

Моя решимость:

Я добавляю какой-нибудь шаг в Jenkinsfile и получаю:

pipeline {
    agent any
    //def app

    stages {
        stage('Build') {
            steps {
                echo "Compiling..."
                sh "${tool name: 'sbt', type: 'org.jvnet.hudson.plugins.SbtPluginBuilder$SbtInstallation'}/bin/sbt compile"
            }
        }

        stage('DockerPublish') {
            steps {
                echo "Docker Stage ..."
                // Generate Jenkinsfile and prepare the artifact files.
                sh "${tool name: 'sbt', type: 'org.jvnet.hudson.plugins.SbtPluginBuilder$SbtInstallation'}/bin/sbt docker:stage"

                echo "Docker Build ..."
                // Run the Docker tool to build the image
                script {
                    docker.withTool('docker') {

                            echo "Environment:"
                            sh "printenv" 
                            app = docker.build('ivanbuh/myservice:latest', 'target/docker/stage')
                            echo "Push to Docker repository ..."
                         docker.withRegistry('https://registry.hub.docker.com', 'docker-hub-credentials') {  
                                app.push("${env.BUILD_NUMBER}")
                                app.push("latest")
                            }

                            echo "Complated ..."
                    }
                }
            }
        }
//https://boxboat.com/2017/05/30/jenkins-blue-ocean-pipeline/
//https://gist.github.com/bvis/68f3ab6946134f7379c80f1a9132057a
        stage ('Deploy') {
            steps {
                sh "docker stack deploy myservice --compose-file docker-compose.yml"
            }
        }
    }
}

person Ivan Bukharin    schedule 15.10.2017    source источник
comment
Вы запускаете докер в привилегированном режиме? (github.com/rancher/)   -  person VonC    schedule 16.10.2017
comment
Привилегированное свойство не поддерживается в файле Docker Compose.   -  person Ivan Bukharin    schedule 16.10.2017
comment
Хорошо, тогда я полагаю, что ваш chown - хорошее решение на данный момент. Я сослался на это в ответе.   -  person VonC    schedule 16.10.2017
comment
попробуйте добавить "USER root", чтобы увидеть, решает ли это проблему с разрешениями   -  person yorammi    schedule 16.10.2017
comment
@yorammi, а где добавить "USER root"?   -  person Ivan Bukharin    schedule 16.10.2017
comment
Я вижу, что у вас нет Dockerfile :-( Там нужно разместить   -  person yorammi    schedule 16.10.2017
comment
Я попробую посмотреть на шаге докера в конвейере Дженкинса для добавления пользователя root   -  person Ivan Bukharin    schedule 16.10.2017
comment
В конвейере jenkins вы можете добавить его, если у вас будет аргумент docker.run. Я не очень разбираюсь в docker compose, но, глядя на документацию, предлагаю попробовать добавить это: security_opt: - label: user: root   -  person yorammi    schedule 16.10.2017
comment
Проблема устранена, описание вверху. Состояние результата. Спасибо всем! Вы помогли!   -  person Ivan Bukharin    schedule 16.10.2017


Ответы (1)


Вы можете посмотреть "Docker в Docker в Jenkins трубопровод ". Он включает в себя шаг:

внутри Jenkinsfile мне нужно подключить мой контейнер сборки к внешнему экземпляру Docker. Это делается путем монтирования самого сокета Docker:

docker.build('my-build-image').inside("--volume=/var/run/docker.sock:/var/run/docker.sock") {  
   // The build here
}

Вы можете увидеть аналогичный подход в "Создание контейнеров с Docker в Docker и Jenkins".

Чтобы сделать Docker из хост-системы доступным, мне нужно сделать API доступным для контейнера докеров Jenkins. Вы можете сделать это, сопоставив сокет докера, доступный в родительской системе.
Я создал небольшой файл для создания докеров, в котором я сопоставляю свои тома и сокет докера следующим образом:

jenkins:
  container_name: jenkins
  image: myjenkins:latest
  ports:
    - "8080:8080"
  volumes:
    - /Users/devuser/dev/docker/volumes/jenkins:/var/jenkins_home
    - /var/run:/var/run:rw

Обратите внимание на специальное сопоставление «/var/run» с rw привилегиями, это необходимо, чтобы убедиться, что контейнер Jenkins имеет доступ к хост-системам docker.sock.

И, как я упоминал ранее, вам может потребоваться запустить докер в привилегированном режиме.
Или, как сообщил OP :

sudo chmod 0777 /var/run/docker.sock
person VonC    schedule 15.10.2017
comment
Я сделал следующий способ, который пишу в первом посте. - person Ivan Bukharin; 19.12.2017