</>

Technology

Jenkins

Difficulty

Advanced

Interview Question

How do you integrate Jenkins with Docker for CI/CD?

Answer

Jenkins + Docker Integration

1. Use Docker as a Build Agent

Run each pipeline stage inside a Docker container — no need to install tools on agents.

GROOVY
pipeline {
    agent {
        docker {
            image 'maven:3.9-openjdk-17-slim'
            args  '-v /root/.m2:/root/.m2 --network host'
        }
    }

    stages {
        stage('Build & Test') {
            steps {
                // Runs inside the Maven container
                sh 'mvn clean test'
            }
        }
    }
}

2. Different Docker Images Per Stage

GROOVY
pipeline {
    agent none

    stages {
        stage('Build') {
            agent {
                docker { image 'maven:3.9-openjdk-17' }
            }
            steps {
                sh 'mvn clean package -DskipTests'
                stash name: 'jar', includes: 'target/*.jar'
            }
        }

        stage('Code Quality') {
            agent {
                docker { image 'sonarsource/sonar-scanner-cli:latest' }
            }
            steps {
                withCredentials([string(credentialsId: 'sonar-token', variable: 'SONAR_TOKEN')]) {
                    sh 'sonar-scanner -Dsonar.login=$SONAR_TOKEN'
                }
            }
        }

        stage('Run Selenium Tests') {
            agent {
                docker {
                    image 'selenium/standalone-chrome:latest'
                    args  '-p 4444:4444 --shm-size=2g'
                }
            }
            steps {
                unstash 'jar'
                sh 'mvn test -Dbrowser=chrome -Dselenium.hub=http://localhost:4444'
            }
        }
    }
}

3. Build and Push a Docker Image

GROOVY
pipeline {
    agent any

    environment {
        DOCKER_IMAGE = "myorg/myapp:${env.BUILD_NUMBER}"
        DOCKER_CREDS = credentials('docker-hub-creds')
    }

    stages {
        stage('Build App') {
            steps {
                sh 'mvn clean package -DskipTests'
            }
        }

        stage('Build Docker Image') {
            steps {
                sh "docker build -t ${DOCKER_IMAGE} ."
            }
        }

        stage('Run Tests Against Container') {
            steps {
                sh "docker run --rm ${DOCKER_IMAGE} mvn test"
            }
        }

        stage('Push to Docker Hub') {
            when { branch 'main' }
            steps {
                sh """
                    echo $DOCKER_CREDS_PSW | docker login -u $DOCKER_CREDS_USR --password-stdin
                    docker push ${DOCKER_IMAGE}
                    docker tag ${DOCKER_IMAGE} myorg/myapp:latest
                    docker push myorg/myapp:latest
                """
            }
        }

        stage('Deploy') {
            when { branch 'main' }
            steps {
                sh "docker-compose -f docker-compose.prod.yml up -d"
            }
        }
    }

    post {
        always {
            // Clean up local Docker images
            sh "docker rmi ${DOCKER_IMAGE} || true"
        }
    }
}

4. Dockerfile for the Application

DOCKERFILE
# Dockerfile
FROM openjdk:17-jre-slim
WORKDIR /app
COPY target/myapp-*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

Requirements on Jenkins Agent

Bash
# Docker must be installed on agent
sudo apt install docker.io
sudo usermod -aG docker jenkins   # allow jenkins user to run docker
sudo systemctl restart jenkins

Follow AutomateQA

Related Topics