Docker镜像未从dockerhub.com注册表中提取最新信息



当我实现CI/CD管道时,我使用docker、kubernetes和jenkins来实现。我正在将生成的Docker映像推送到Dockerhub存储库。

当我提取时,它不是从Dockerhub.com注册表中提取最新的。所以它不会在我的应用程序中显示更新的响应。我添加了testdeployment.yaml文件,如下所示。存储库凭据仅存储在Jenkinsfile中。

spec:
containers:
- name: test-kube-deployment-container
image: "spacestudymilletech010/spacestudykubernetes:latest"
imagePullPolicy: Always
ports:
- name: http
containerPort: 8085
protocol: TCP

Jenkinsfile

sh 'docker build -f /var/lib/jenkins/workspace/jpipeline/pipeline/Dockerfile -t spacestudymilletech010/spacestudykubernetes:latest /var/lib/jenkins/workspace/jpipeline/pipeline'
sh 'docker login --username=<my-username> --password=<my-password>' 
sh 'docker push spacestudymilletech010/spacestudykubernetes:latest'

我如何确定它为什么没有从Dockerhub.com上提取最新图像?

您似乎在反复将:latest推送到dockerhub?

如果是这样,那么这就是你问题的原因。您可以从Jenkins作业将最新推送到集线器,但如果运行部署pod的k8s节点已经在本地存储了一个名为latest的标记,那么它将使用该标记。

为了澄清latest只是一个字符串,它也可以是foobar。实际上,并不意味着docker将提取容器的最新版本。

有两个收获:

  • 在k8s中使用latest几乎总是一个非常糟糕的主意
  • 多次推送同一个标签总是一个坏主意,事实上许多回购不会让你这么做

关于使用latest。这来自个人经验,在我工作的地方,在我们采用k8s的早期,我们在任何地方都使用它。直到有一天我们发现我们的木偶服务器已经不工作了。经过调查,我们发现节点已经死亡,吊舱在另一个节点上重新旋转,并拉出了一个不同的latest,这是一个新的主要版本,打破了局面。

这并不明显,因为kubectl describe pod显示的标签名称与以前相同,所以显然没有任何变化。

要补充评论中提到的一点:你有ImagePullPolicy: 'Always',但如果你用相同的标签名做kubectl apply -f mypod.yaml,k8s无法知道你实际上已经改变了图像

最新更新