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
相关产品推荐
相关产品推荐

