Minikube 中如何使用本地的 Docker 镜像?
三种方式让 Minikube 用上本地镜像:minikube image load 载入、eval "$(minikube docker-env)" 直接用其守护进程构建、minikube image build。同时明确 imagePullPolicy:IfNotPresent 允许缓存缺失时拉取,Never 才禁止拉取。
最快方式:minikube image load my-image:v1 把宿主机本地镜像直接注入 Minikube。注意还要把 Deployment 的 imagePullPolicy 设为 IfNotPresent(或 Never)——IfNotPresent 在本地缺失时仍会拉取,Never 则要求本地已有镜像。Always 会查询仓库解析 digest,但已缓存相同 digest 时仍可复用本地内容。
方式一:minikube image load(直给)
# 宿主机正常构建
docker build -t my-image:v1 .
# 注入 Minikube
minikube image load my-image:v1
# 确认
minikube image ls | grep my-image
方式二:共用 Minikube 的 Docker 守护进程
在支持 Docker runtime 的环境中,把当前终端的 docker 客户端指向 Minikube 内部的 Docker;containerd 等 runtime 不适用此方式:
eval "$(minikube docker-env)"
docker build -t my-image:v1 . # 直接构建进 Minikube
docker images # 看到的是 Minikube 里的镜像
# 用完切回宿主机
eval "$(minikube docker-env -u)"
构建产物天然在 Minikube 里,省了 load 一步;注意别在这个终端误操作生产镜像。
方式三:minikube image build
minikube image build -t my-image:v1 .
由当前 Minikube profile 的节点构建;多节点时可按版本支持使用 --all,并确认各调度目标节点都有兼容架构的镜像。
Deployment 里的关键配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
spec:
selector:
matchLabels:
app: local-demo
template:
metadata:
labels:
app: local-demo
spec:
containers:
- name: app
image: my-image:v1
imagePullPolicy: IfNotPresent # 缓存缺失时仍拉取;Never 则不拉取
两个细节:
- 创建对象时,
:latest或省略标签通常默认Always;策略值设定后不会因后来换标签而自动重算,应显式核对 - 镜像名可以带仓库域名前缀,关键是与节点上已加载的完整引用及拉取策略一致
常见问题(FAQ)
Q:Pod 报 ErrImagePull / ImagePullBackOff?
A:查看 Pod 事件,检查镜像完整引用、目标节点缓存、CPU 架构、拉取策略及仓库认证;仓库前缀本身不是错误。
Q:load 进去改了代码要重来吗?
A:要。重新 build(注意换标签或强制覆盖)再 minikube image load,然后重启 Pod。
Q:多节点 Minikube 怎么办?
A:确认使用正确 profile,并检查镜像已加载到所有可能调度的节点;大集群本地开发可以考虑 minikube addons enable registry 跑集群内仓库。