如何从Minikube中删除现有下载的Docker镜像

3
我正在使用DevSpace工具将多个服务部署到我的本地集群(minikube)。一旦有人对其中一个服务进行更改并将镜像推送到我们的私有仓库,我需要这些更改在我的本地上可用。现在我所做的是完全删除minikube集群并启动一个新的集群。在这种情况下,所有具有相同标签的图像都会被更新为最新版本,而不是缓存的版本。

但我相信有一种更优雅的方法来解决这个问题。因此,在重新部署服务之前,我需要以某种方式清理/删除本地集群中过时的镜像。

有人能指出它们存储在哪里,我如何查看和删除它们吗?谢谢。

4个回答

7

作为DevSpace维护者,您需要做两件事:

  1. 需要一些东西来强制每次运行devspace dev时重新创建你的pod。 因此,如果您正在使用Deployment或StatefulSet,则可以向您的Pod模板添加一个标签,例如包含DevSpace内置时间戳变量作为值。
  2. 在您的Pod规范中添加imagePullPolicy: Always以确保Kubernetes始终拉取每个新创建的Pod的最新镜像。否则,Kubernetes将使用已缓存的镜像。

结合起来,如果您正在使用组件图表部署,则可能如下所示在您的devspace.yaml文件中:

deployments:
- name: my-component
  helm:
    componentChart: true
    values:
      labels:
        timestamp: $!{DEVSPACE_TIMESTAMP}  # here is 1.
      containers:
      - image: "YOUR_IMAGE:latest"         # specify any tag here that you want
        imagePullPolicy: Always            # here is 2.

$!{DEVSPACE_TIMESTAMP} = $!{} 被强制转换为字符串形式,因为k8s只允许标签使用字符串值,并且DEVSPACE_TIMESTAMP是DevSpace中一个预定义的变量名称。更多详情请参阅:https://devspace.sh/cli/docs/configuration/variables/basics#predefined-variables


imagePullPolicy: Always - 这解决了我在minikube+DevSpace上的问题。谢谢! - vitali_li

1

不要删除所有的图像并重新创建集群,你可以执行滚动更新(假设你正在使用部署,因为你应该这样做)。

kubectl set image deployments/<deployment-name>=<repository-name>/<image-name>:<image-tag>

这也假设您正在使用带有标签的适当版本控制。

或者,如果您正在使用带有“latest”标签的图像,则可以将ImagePullPolicy更改为Always,然后使用以下命令删除必要的Pod:

kubectl delete pod <pod-name> <pod2-name> ...

随着新的Pod被创建,较新的镜像将被拉取。


如果您仍然想要删除未使用的Docker镜像,可以使用以下命令:
docker image prune -a

这将删除所有没有至少一个相关容器的图像。


我同意@Lucas Gentele下面写的内容。 - vitali_li

0
你可以尝试以下命令。 删除未标记的镜像:
docker image rm $(docker images | grep "^<none>" | awk "{print $3}")

删除所有已停止的容器

docker container rm $(docker ps -a -q)

(或者)

您需要停止并禁用localkube服务:

systemctl disable localkube.service
systemctl stop localkube.service

之后,您可以停止并删除容器。

docker system prune -a

这会删除所有图片


当我执行docker images命令时,我根本看不到任何部署在minikube上的镜像。 - vitali_li

0

阻塞/命令式方法

这里是我在一个构建脚本中使用的另一种方法。

其主要优点是该命令是同步的,因此您可以将其包含在诸如构建脚本之类的内容中,并且不需要每次重建时都让您的集群下载镜像以便偶尔进行更新。

一些设置

# an example of building a new image and uploading it for reload in k8s
# in the question, this is already done

docker build -t jamesandariese/my-cool-image:latest .
docker push jamesandariese/my-cool-image:latest

魔法就在这里发生

# reload image in k8s, ignoring cached image

kubectl run \
    --image=jamesandariese/my-cool-image:latest \
    --image-pull-policy=Always \
    --restart=Never \
    --rm=true \
    -i download-image --command -- true

if [ $? -eq 0 ];then
    1>&2 echo "all pods launched with this image tag will now use the updated image"
else
    1>&2 echo "FAILED TO REFRESH IMAGE.  See error from kubectl"
fi

这种方法基于以下几个事实:

  • minikube在单个k8s节点上运行(也适用于其他单节点集群,如k3s)

  • 使用图像更新并将图像拉取策略设置为always运行新的pod会导致下载新图像

  • 通过将命令覆盖为true并附加(通过-i),我们获得与成功更新图像匹配的退出代码

一旦kubectl成功退出,图像就会在minikube中更新。

注意:可以通过DaemonSetkubectl wait在整个集群中执行此操作,但是当您拥有完整的集群时,您的SDLC应该专注于如何正确标记事物,以便它们不总是:latest:prod。 这种转变对于允许可预测的回滚和在集群中同时运行多个版本非常重要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接