9

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" } } } } 
9
  • Do you run docker in privilege mode though? (github.com/rancher/…) Commented Oct 16, 2017 at 11:05
  • Property "privileged" is unsupported in Docker Compose file. Commented Oct 16, 2017 at 11:42
  • OK, then I suppose your chown is a good workaround for now. I have referenced it in the answer. Commented Oct 16, 2017 at 12:13
  • try to add 'USER root' to see if this solves the permission issue Commented Oct 16, 2017 at 12:13
  • @yorammi , where place to add 'USER root'? Commented Oct 16, 2017 at 12:24

1 Answer 1

7

You can look at "Docker in Docker in Jenkins pipeline". It includes the step:

inside the Jenkinsfile, I need to connect my build container to the outer Docker instance. This is done by mounting the Docker socket itself:

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

You can see a similar approach in "Building containers with Docker in Docker and Jenkins".

In order to make the Docker from the host system available I need to make the API available to the Jenkins docker container. You can do this by mapping the docker socket that is available on the parent system.
I have created a small docker-compose file where I map both my volumes and the docker socket as following:

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 

Please note the special mapping the ‘/var/run’ with rw privileges, this is needed to make sure the Jenkins container has access to the host systems docker.sock.

And, as I mentioned before, you might need to run docker in privilege mode.
Or, as the OP reported:

sudo chmod 0777 /var/run/docker.sock 
Sign up to request clarification or add additional context in comments.

1 Comment

I making next way which write on first post.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.