如何将 jenkins 凭据传递到 docker build 命令?
How to pass jenkins credentials into docker build command?
我的 Jenkins 管道代码使用
从 bitbucket 中成功检出我的私人 git 回购
checkout([$class: 'GitSCM',
userRemoteConfigs: [[credentialsId: 'cicd-user', url:'ssh://git@bitbucket.myorg.co:7999/A/software.git']]
在同一个 software.git 我有一个 Docker 文件,我想用它来构建 Kubernetes 上 software.git 中存在的各种构建目标,我正在尝试下面的方法来传递 jenkins 凭据放入我要构建的 docker 容器和 运行.
因此,当我检出 software.git(以上代码)时,在同一个 jenkins 管道中,我尝试执行以下操作来构建 docker 容器
withCredentials([sshUserPrivateKey(credentialsId: 'cicd-user', keyFileVariable: 'FILE')]) {
sh "cd ${WORKSPACE} && docker build -t ${some-name} --build-arg USERNAME=cicd-user --build-arg PRIV_KEY_FILE=$FILE --network=host -f software/tools/jenkins/${some-name}/Dockerfile ."
}
在Docker文件中我做
RUN echo "$PRIV_KEY_FILE" > /home/"$USERNAME"/.ssh/id_rsa && \
chmod 700 /home/"$USERNAME"/.ssh/id_rsa
运行 echo "主机 bitbucket.myorg.co\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
但我仍然无法从我的 Docker 容器中成功检出我的私人仓库。我错过了什么?有什么意见、建议吗?谢谢
请阅读 Groovy String Interpolation。
在你的表达中
sh "cd ${WORKSPACE} && docker build -t ${some-name} \
--build-arg USERNAME=cicd-user \
--build-arg PRIV_KEY_FILE=$FILE --network=host \
-f software/tools/jenkins/${some-name}/Dockerfile ."
您使用双引号,因此 Groovy 插入字符串中的所有变量。这包括 $FILE
,因此 Groovy 将其替换为名为 FILE
的 Groovy 变量的值。您没有任何具有该名称的 Groovy 变量(而是与 Groovy 不同的 bash
变量)因此它被替换为空字符串。
为了防止插入那个特定的变量,你需要提示 Groovy 不要插入这个特定的变量,通过用 \
:
转义这个 $
sh "cd ${WORKSPACE} && docker build -t ${some-name}\
--build-arg USERNAME=cicd-user \
--build-arg PRIV_KEY_FILE=$FILE --network=host \
-f software/tools/jenkins/${some-name}/Dockerfile ."
我的 Jenkins 管道代码使用
从 bitbucket 中成功检出我的私人 git 回购checkout([$class: 'GitSCM',
userRemoteConfigs: [[credentialsId: 'cicd-user', url:'ssh://git@bitbucket.myorg.co:7999/A/software.git']]
在同一个 software.git 我有一个 Docker 文件,我想用它来构建 Kubernetes 上 software.git 中存在的各种构建目标,我正在尝试下面的方法来传递 jenkins 凭据放入我要构建的 docker 容器和 运行.
因此,当我检出 software.git(以上代码)时,在同一个 jenkins 管道中,我尝试执行以下操作来构建 docker 容器
withCredentials([sshUserPrivateKey(credentialsId: 'cicd-user', keyFileVariable: 'FILE')]) {
sh "cd ${WORKSPACE} && docker build -t ${some-name} --build-arg USERNAME=cicd-user --build-arg PRIV_KEY_FILE=$FILE --network=host -f software/tools/jenkins/${some-name}/Dockerfile ."
}
在Docker文件中我做
RUN echo "$PRIV_KEY_FILE" > /home/"$USERNAME"/.ssh/id_rsa && \
chmod 700 /home/"$USERNAME"/.ssh/id_rsa
运行 echo "主机 bitbucket.myorg.co\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
但我仍然无法从我的 Docker 容器中成功检出我的私人仓库。我错过了什么?有什么意见、建议吗?谢谢
请阅读 Groovy String Interpolation。
在你的表达中
sh "cd ${WORKSPACE} && docker build -t ${some-name} \
--build-arg USERNAME=cicd-user \
--build-arg PRIV_KEY_FILE=$FILE --network=host \
-f software/tools/jenkins/${some-name}/Dockerfile ."
您使用双引号,因此 Groovy 插入字符串中的所有变量。这包括 $FILE
,因此 Groovy 将其替换为名为 FILE
的 Groovy 变量的值。您没有任何具有该名称的 Groovy 变量(而是与 Groovy 不同的 bash
变量)因此它被替换为空字符串。
为了防止插入那个特定的变量,你需要提示 Groovy 不要插入这个特定的变量,通过用 \
:
$
sh "cd ${WORKSPACE} && docker build -t ${some-name}\
--build-arg USERNAME=cicd-user \
--build-arg PRIV_KEY_FILE=$FILE --network=host \
-f software/tools/jenkins/${some-name}/Dockerfile ."