当前,我正在尝试添加版本号或内部版本号,以将Docker映像部署在Kubernetes集群上。以前,我只使用:latest
标签。但是,当我使用latest
标签时,我发现从Dockerhub映像注册表中提取问题。因此,当我在<image-name>:{build-number}
之类的docker映像中使用内部版本号时。
在Kubernetes部署中,我正在使用部署和服务。我正在像下面这样在部署文件中定义映像存储库,
containers:
- name: test-kube-deployment-container
image: samplekubernetes020/testimage:latest
ports:
- name: http
containerPort: 8085
protocol: TCP
在这里,而不是最新的标签,我想将内部版本号与映像放在部署YAML中。
<image-name>:${buildnumber}
吗?映像版本实施更新
我修改过的Jenkinsfile包含如下步骤,将图像版本号分配给图像。但是在更改存储库后,我仍然没有得到更新的结果,
我在Jenkinsfile中创建了以下步骤
stage ('imagebuild')
{
steps
{
sh 'docker build -f /var/lib/jenkins/workspace/jpipeline/pipeline/Dockerfile -t spacestudymilletech010/spacestudykubernetes /var/lib/jenkins/workspace/jpipeline/pipeline'
sh 'docker login --username=my-username --password=my-password'
sh "docker tag spacestudymilletech010/spacestudykubernetes:latest spacestudymilletech010/spacestudykubernetes:${VERSION}"
sh 'docker push spacestudymilletech010/spacestudykubernetes:latest'
}
}
我的部署YAML文件包含如下内容,
containers:
- name: test-kube-deployment-container
image: spacestudymilletech010/spacestudykubernetes:latest
ports:
- name: http
containerPort: 8085
protocol: TCP
困惑
注意::当我检查dockerhub存储库时,每次显示最新推送状态
所以我的困惑是:
答案 0 :(得分:2)
标准方法或至少对我们大多数人有效的方法是创建版本化或标记的图像。例如
samplekubernetes020/testimage:1
samplekubernetes020/testimage:2
samplekubernetes020/testimage:3
...
...
现在,我将尝试回答您的实际问题,即当图像标签升级时,如何更新部署中的图像?
输入解决方案
一旦上传了映像,就可以使用kubectl
或kubernetes API使用最新的容器映像更新部署。
kubectl set image deployment/my-deployment test-kube-deployment-container=samplekubernetes020/testimage:1 --record
上述步骤通常在CI管道中进行,您可以在其中存储映像版本或image:版本在环境变量本身中。
更新帖子评论
由于您正在使用Jenkins,因此当Jenkins在构建运行时注入这些值时,您可以在Jenkinsfile本身中获得当前的内部版本号和 commit-id 以及许多其他变量。对我来说,这有效。只是参考。
environment {
NAME = "myapp"
VERSION = "${env.BUILD_ID}-${env.GIT_COMMIT}"
IMAGE = ${NAME}:${VERSION}"
}
stages {
stage('Build') {
steps {
echo "Running ${VERSION} on ${env.JENKINS_URL}"
git branch: "${BRANCH}", .....
echo "for brnach ${env.BRANCH_NAME}"
sh "docker build -t ${NAME} ."
sh "docker tag ${NAME}:latest ${IMAGE_REPO}/${NAME}:${VERSION}"
}
}
}
答案 1 :(得分:0)
这种詹金斯管道方法对我有用。 我正在使用Jenkins内部版本号作为docker映像的标签,并推送到docker hub。现在将yaml文件应用于k8s集群,然后使用相同的标签更新部署中的映像。
示例管道脚本代码段位于此处
stage('Build Docker Image'){
sh 'docker build -t {dockerId}/{projectName}:${BUILD_NUMBER} .'
}
stage('Push Docker Image'){
withCredentials([string(credentialsId: 'DOKCER_HUB_PASSWORD', variable: 'DOKCER_HUB_PASSWORD')]) {
sh "docker login -u {dockerId} -p ${DOKCER_HUB_PASSWORD}"
}
sh 'docker push {dockerId}/{projectName}:${BUILD_NUMBER}'
}
stage("Deploy To Kuberates Cluster"){
sh 'kubectl apply -f {yaml file name}.yaml'
sh 'kubectl set image deployments/{deploymentName} {container name given in deployment yaml file}={dockerId}/{projectName}:${BUILD_NUMBER}'
}