Kpizzle
Kpizzle

Reputation: 430

Missing Required Parameter in Docker File

I'm learning how to use Jenkins and jenkinsfile for my CI/CD project, and when trying to run a docker image to run my selenium tests against, an error is thrown saying that the docker image param is missing.

I've followed the docks on the jenkins site for a tutorial and I'm now trying to fit that for my own purposes.

pipeline {
agent any

stages {
    stage('Build') {
        steps {
            echo 'Building..'
            sh 'npm install'
        }
    }
    stage('Test') {
        steps {
            echo 'Testing..'
             docker {
                        image 'selenium/standalone-firefox:3.141.59-gold' 
                        args '-p 4444:4444' 
                }
            sh 'npm test'
        }
    }
    stage('Deploy') {
        steps {
            echo 'Deploying....'
        }
    }
 }
}

Docker should run on my Ubuntu server with port 4444 of the docker exposed and mapped to port 4444 of the server.

Upvotes: 0

Views: 3114

Answers (2)

Saurabh Gupta
Saurabh Gupta

Reputation: 450

You can always run the docker using sh

sh''' 
    //your docker command here
'''

Upvotes: 0

yong
yong

Reputation: 13712

You used Declarative Pipeline for your Jenkinsfile, not Scripted Pipeline. For Declarative Pipeline, the docker is a directive which can only be used to specify agent for entire pipeline or stage as following:

pipeline {
   agent { // specify docker container for entire pipeline
      docker {
         image ''
         args ''
      }
   }
}

stage('test') {
   agent { // all steps of this stage will be executed inside this docker container
      docker {
         image ''
         args ''
      }
   }
}

You can't use this docker directive as pipeline step, like sh, 'echo'.

Jenkins indeed supply a docker DSL which can be directly used in Scripted Pipeline.

Declarative Pipeline supply a step script in where we can put Scripted Pipeline-liked script as following:

stage('test') {
  steps {
    script {
      def version = ....
      def img = docker.build(...)
      img.push()

      docker.image(...).inside(){}
    }
  }
}

Thus you can change your Jenkinsfile as following and give a trying.

pipeline {
agent any

stages {
    stage('Build') {
        steps {
            echo 'Building..'
            sh 'npm install'
        }
    }
    stage('Test') {
        steps {
            echo 'Testing..'
            script {
                docker.image('selenium/standalone-firefox:3.141.59-gold')
                      .inside('-p 4444:4444'){}
            }
            sh 'npm test'
        }
    }
    stage('Deploy') {
        steps {
            echo 'Deploying....'
        }
    }
 }
}

By default the Docker Pipeline integrates assumes the default Docker Registry of Docker Hub.

If you intend to use use a custom Docker Registry, you can use docker.withRegistry to specify the custom Registry URL and Credentials as following:

stage('Test') {
    steps {
        echo 'Testing..'

            script {
                docker.withRegistry('<custom docker registry>', 
                                    '<credentialsId for custom docker registry if required>') {
                    docker.image('selenium/standalone-firefox:3.141.59-gold')
                          .inside('-p 4444:4444'){}
                }
            }
        sh 'npm test'
    }
}

Note: If the custom docker registry need credentails, you have to add your account for custom docker registry into Jenkins via Jenkins Credentials. After adding, Jenkins will assign a id for your account, the id called credentialsId which used in above code.

Upvotes: 2

Related Questions