gpt4 book ai didi

docker - 如何在 Jenkins 中使用内部版本号对 docker 图像进行版本控制以部署为 Kubernetes 部署?

转载 作者:行者123 更新时间:2023-12-02 12:02:48 32 4
gpt4 key购买 nike

目前我正在尝试为 Docker 镜像添加版本号或构建号以部署在 Kubernetes 集群上。以前我只使用 :latest标签。但是当我使用 latest 时标记,我发现从 Dockerhub 镜像注册表中提取问题。因此,当我将内部版本号用于我的 docker 镜像时,如 <image-name>:{build-number} .

应用结构

在我的 Kubernetes 部署中,我使用部署和服务。我在我的部署文件中定义我的图像存储库,如下所示,

   containers:
- name: test-kube-deployment-container
image: samplekubernetes020/testimage:latest
ports:
- name: http
containerPort: 8085
protocol: TCP

在这里,我想在部署 YAML 中将内部版本号和我的图像放在一起,而不是最新标签。

  1. 我可以使用环境变量来保存随机内部版本号以进行访问,例如 <image-name>:${buildnumber}
  2. 如果我想使用提供随机数的环境变量,如何为环境变量生成随机数?

图像版本实现更新

我修改后的 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 存储库时,每次它都显示最新的推送状态

所以我的困惑是:

  1. 在我的 deployment.yaml 文件中拉取最新镜像有什么问题吗?
  2. 当我在构建图像并推送的机器上标记图像时出现问题吗?

最佳答案

标准方法或至少对我们大多数人有用的方法是创建版本化或标记图像。例如

samplekubernetes020/testimage:1
samplekubernetes020/testimage:2
samplekubernetes020/testimage:3
...
...

现在我将尝试回答您的实际问题,即当我的镜像标签升级时如何更新部署中的镜像?

输入解决方案

  • 当您使用最新版本的代码编译和构建新图像时,使用增量唯一版本标记。此标签可以是任何唯一的或内部版本号等。

  • 然后将这个标记的镜像推送到 docker registry

  • 镜像上传后,您就可以使用 kubectl 或 kubernetes API 使用最新的容器镜像更新部署。

    kubectl 设置图像部署/my-deployment test-kube-deployment-container=samplekubernetes020/testimage:1 --record

  • 上述一组步骤通常发生在您的 CI 管道中,您将图像版本或图像:版本存储在环境变量本身中。


更新帖子评论

由于您使用的是 Jenkins,您可以在 Jenkinsfile 本身中获取当前的构建号commit-id 以及许多其他变量,因为 Jenkins 在构建运行时注入(inject)这些值。对我来说,这行得通。仅供引用。

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

关于docker - 如何在 Jenkins 中使用内部版本号对 docker 图像进行版本控制以部署为 Kubernetes 部署?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58707792/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com