You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Minikube无法加载DockerHub或本地更新后的Docker镜像问题

问题描述

在Ubuntu 22.04上运行Minikube,更新Docker镜像并推送到DockerHub后,删除原有Deployment并重新应用部署配置,但Pod日志仍显示数小时前的旧代码。执行kubectl delete -f deploy.yml后服务已移除,执行apply后服务存在,但日志依旧为旧内容。本地运行该已推送至DockerHub的镜像能显示新代码,且已确认docker push成功上传了新代码。这是Minikube的Bug吗?

部署脚本

apiVersion: apps/v1
kind: Deployment
metadata:
  name: metadata
spec:
  replicas: 2
  selector:
    matchLabels:
      app: metadata
  template:
    metadata:
      labels:
        app: metadata
    spec:
      containers:
      - name: metadata
        image: dwschulze/metadata:1.0.0
        imagePullPolicy: IfNotPresent
        ports:
          - containerPort: 8081
---
apiVersion: v1
kind: Service
metadata:
  name: metadata
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    targetPort: 8081
  selector:
    app: metadata
问题原因及解决办法

这不是Minikube的Bug,问题出在imagePullPolicy: IfNotPresent配置上:

  • 当镜像使用固定标签(如1.0.0)且该策略生效时,Minikube节点会优先使用本地已缓存的旧镜像,不会主动拉取DockerHub上的新镜像,即便重新部署Deployment也不会触发更新。

解决办法有以下几种:

  • 修改镜像拉取策略:将imagePullPolicy改为Always,这样每次创建Pod都会从DockerHub拉取最新镜像。若镜像标签为latest,默认拉取策略就是Always,但固定标签需显式设置。修改后的容器配置片段:
    containers:
    - name: metadata
      image: dwschulze/metadata:1.0.0
      imagePullPolicy: Always
      ports:
        - containerPort: 8081
    
  • 使用动态版本标签:每次更新镜像时使用新标签(如1.0.1、v2或基于Git commit hash的标签),Kubernetes会识别到镜像变更,自动拉取新镜像,无需修改拉取策略。
  • 手动清理Minikube本地缓存:进入Minikube节点删除旧镜像,再重新部署:
    minikube ssh
    docker rmi dwschulze/metadata:1.0.0
    exit
    kubectl apply -f deploy.yml
    
  • 触发滚动更新:通过修改Deployment的无关配置(如添加时间戳注释)强制触发滚动更新,拉取新镜像:
    kubectl patch deployment metadata -p '{"spec":{"template":{"metadata":{"annotations":{"force-update":"'$(date +%s)'"}}}}}'
    

内容的提问来源于stack exchange,提问作者Dean Schulze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 15:08:23