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

Mr.*_*Eng 3 docker kubernetes

当我实现 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
Run Code Online (Sandbox Code Playgroud)

詹金斯文件

 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'
Run Code Online (Sandbox Code Playgroud)

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

SiH*_*iHa 7

看起来你是在反复推:latest送到 dockerhub 吗?

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

澄清一下 -latest只是一个字符串,它同样可以是foobar。这实际上并不意味着docker 将拉取最新版本的容器。

从中可以得出两个结论:

  • 在 k8s 中使用几乎总是一个非常糟糕的主意latest
  • 多次推送同一个标签总是一个坏主意,事实上许多存储库不允许你这样做。

关于使用latest。这是来自个人经验,在我的工作场所,在我们采用 k8s 的早期,我们到处都在使用它。直到有一天我们发现我们的木偶服务器不再工作了。经过调查,我们发现该节点已经死亡,pod 在不同的节点上重新旋转,并且latest拉出了一个不同的节点,这是一个新的主要版本,破坏了一些东西。

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

添加评论中提到的一个很好的观点:你有ImagePullPolicy: 'Always',但是如果你正在使用kubectl apply -f mypod.yaml相同的标签名称,k8s无法知道你实际上已经更改了图像