如何在声明式管道中将Jenkins构建参数作为参数传递给dockerfile

时间:2020-09-14 12:54:03

标签: docker dockerfile jenkins-pipeline jenkins-declarative-pipeline

我有一个声明性的詹金斯管道。我正在尝试将诸如jira_id和存储库名称之类的Jenkins构建参数以及凭据作为参数传递给dockerfile。

但是,在执行时,dockerfile无法接收下面传递的任何参数。

我可以知道正确的方法吗?

Jenkinsfile阶段

stage('Create Image'){
                    steps{
                          script{
                          withCredentials([usernamePassword(credentialsId: 'admin', passwordVariable: 'admin_pw', usernameVariable: 'admin_user')]){
                          dir("${WORKSPACE}/jenkins/"){
                          def repo=docker.build("latest","--build-arg admin_user=$admin_user --build-arg admin_pw=$admin_pw --build-arg jira_id=$jira_id --build-arg repository_name=$repository_name --no-cache .")
                          }
                     }
                 }
             }
        }

Dockerfile

FROM centos:8
RUN echo "$repository_name, $jira_id, $admin_user"

3 个答案:

答案 0 :(得分:1)

使用ARGENV之间是有区别的。

ARG可以在使用--build-arg构建图像的过程中进行设置,一旦构建图像,您将无法再访问它们。

ENV值在构建过程中以及容器运行之后都可以访问。您可以在Dockerfile中设置ENV值。

enter image description here

Jenkinsfile阶段是正确的。

Dockerfile中的更改

FROM centos:8
ENV jira_id=$jira_id
ENV repository_name=$repository_name
ENV admin_user=$admin_user
RUN echo "$repository_name, $jira_id, $admin_user"

答案 1 :(得分:0)

找到了解决方案。在dockerfile中,我必须使用ARG接收所有变量。 ARG jira_id = $ jira_id

答案 2 :(得分:0)

虽然上述答案是正确的,但如果您需要在 Dockerfile 的“第一行”中进行动态命名,即如果您有多个存储库要为同一个构建提取,则它会失败:

FROM $corp_repo/centos:8

为了使它工作,我以不同的方式将 sed 与 ENV 一起使用,在 jenkins 阶段使用以下内容在 Dockerfile 之外定义 ENV:

env.CORP_REPO = "${params.corp_repo}/centos:latest"

我的 jenkins 舞台看起来像这样:

    stage('Build docker') {
    daArtifactoryHelper.artifactoryDockerLogin(dockerArtifactoryAddress, artifactoryCredentialId)
    env.CORP_REPO = "${params.corp_repo}/centos:latest"
    sh 'sed -i "1c\$CORP_REPO" Dockerfile'
    sh "cat Dockerfile"
    sh "docker build -t ${fullImageName}:${version} ."
    sh "docker push ${fullImageName}:${version}"
}

此处,sh 'sed -i "1c\$CORP_REPO" Dockerfile' 用使用 ENV 设置的动态存储库名称替换 First 行。

你可以玩它。 同样,这适用于第 n 行,因为您在 Dockerfile 之外定义范围。

干杯!

相关问题