Docker文件中缺少必需的参数

时间:2019-02-12 11:37:14

标签: jenkins jenkins-pipeline

我正在学习如何在我的CI / CD项目中使用Jenkins和jenkinsfile,并且在尝试运行docker映像以对其进行硒测试时,抛出错误,提示缺少docker映像参数。

我已经在jenkins网站上的码头上进行了教程学习,现在我正尝试将其调整为适合自己的目的。

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应该在我的Ubuntu服务器上运行,并暴露docker的端口4444并映射到服务器的端口4444。

1 个答案:

答案 0 :(得分:0)

您将Declarative Pipeline用于Jenkinsfile,而不是Scripted Pipeline。对于Declarative Pipelinedocker是一条伪指令,只能用于为整个管道或阶段指定agent,如下所示:

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 ''
      }
   }
}

您不能将此docker指令用作管道步骤,例如sh,“ echo”。

Jenkins确实提供了docker DSL,可以直接在Scripted Pipeline中使用。

Declarative Pipeline提供了一个步骤script,我们可以在其中放置类似于脚本的管道脚本,如下所示:

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

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

因此,您可以按照以下方式更改Jenkinsfile并进行尝试。

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....'
        }
    }
 }
}

默认情况下,Docker Pipeline集成假定Docker Hub的默认Docker Registry。

如果打算使用自定义Docker注册表,则可以使用docker.withRegistry指定自定义注册表URL和凭据,如下所示:

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'
    }
}

注意::如果自定义Docker注册表需要使用credentails,则必须通过Jenkins凭据将自定义Docker注册表的帐户添加到Jenkins中。添加后,Jenkins将为您的帐户分配一个ID,即上述代码中使用的ID。