I use Jenkins from docker container. And I want to build docker image in Jenkins pipeline but docker is not exist in this container (where Jenkins).
Jenkins container deployed by Docker Compose, yml file:
version: "3.3" services: jenkins: image: jenkins:alpine ports: - 8085:8080 volumes: - ./FOR_JENKINS:/var/jenkins_home What we can do to build docker image in Jenkins pipeline? Can we deploy some docker container with docker and use once for build docker image? or something else? How do you doing with they?
Edit:
Thanks @VonC, I checked your information, but... "permission denied"
Docker Compose file:
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") //} } } } } } } Result:
[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 Edit: Last problem with "permission denied" fixed with:
>>sudo chmod 0777 /var/run/docker.sock Worked State:
Call in host:
>>sudo chmod 0777 /var/run/docker.sock Docker Compose file:
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") //} } } } } } } My resolve:
I add some step in Jenkinsfile and get:
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" } } } }