我有一个声明性的詹金斯管道。我正在尝试将诸如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"
答案 0 :(得分:1)
使用ARG
和ENV
之间是有区别的。
ARG
可以在使用--build-arg构建图像的过程中进行设置,一旦构建图像,您将无法再访问它们。
ENV
值在构建过程中以及容器运行之后都可以访问。您可以在Dockerfile中设置ENV值。
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 之外定义范围。
干杯!