- 云原生
- 开发工具
- DevOps
- 容器编排
【免费下载链接】devspace
DevSpace - The Fastest Developer Tool for Kubernetes ⚡ Automate your deployment workflow with DevSpace and develop software directly inside Kubernetes.
DevSpace 的devspace cleanup命令组负责回收开发过程中积累的冗余资源,本篇以官方命令文档devspace cleanup为骨架,结合当前仓库的源码实现,完整讲解devspace cleanup images与devspace cleanup local-registry两个子命令的作用、执行流程、相关的全局标志,以及它们背后对 Docker API 和 Kubernetes 资源的调用链,帮助你在反复构建镜像、使用本地镜像仓库后安全地清理本地 Docker 守护进程和集群中的残留物。
命令总览:devspace cleanup 是什么
devspace cleanup用于"清理资源"(Cleans up resources),它本身是一个父命令,不接收位置参数,也不直接执行删除动作。真正的清理逻辑由子命令承担。从命令注册源码 NewCleanupCmd 可以看到其结构:
// cmd/cleanup/cleanup.go cleanupCmd := &cobra.Command{ Use: "cleanup", Short: "Cleans up resources", Args: cobra.NoArgs, } cleanupCmd.AddCommand(newImagesCmd(f, globalFlags)) // devspace cleanup images cleanupCmd.AddCommand(newLocalRegistryCmd(f, globalFlags)) // devspace cleanup local-registry // 允许插件注册 "cleanup" 分组下的扩展子命令 plugin.AddPluginCommands(cleanupCmd, plugins, "cleanup")也就是说,devspace cleanup提供两个内置子命令:
devspace cleanup images—— 删除本地 Docker 中由 DevSpace 构建的镜像,并顺带清理 dangling(悬空)镜像;devspace cleanup local-registry—— 删除 DevSpace 部署到集群中的本地镜像仓库(Local Registry)。
同时该命令组还通过plugin.AddPluginCommands(cleanupCmd, plugins, "cleanup")预留了插件扩展点:已安装的 DevSpace 插件可以注册名为cleanup xxx的子命令(可用devspace list plugins查看已注册的插件命令)。
全局与继承标志(Global & Inherited Flags)
devspace cleanup及其子命令继承了 DevSpace 的全部全局标志。以下按官方命令文档(devspace cleanup --help)完整列出,这些标志对两个子命令同样生效:
| 标志 | 说明 |
|---|---|
-h, --help | 显示当前命令的帮助 |
--config string | 指定要使用的 devspace 配置文件(devspace.yaml路径) |
--debug | 出错时打印堆栈(stack trace) |
--disable-profile-activation | 为 true 时忽略所有 profile 激活配置 |
--inactivity-timeout int | 用户无鼠标/键盘交互多少分钟后 DevSpace 自动退出,0 表示禁用。仅在 Windows 和 macOS 上支持(默认 180) |
--kube-context string | 指定要使用的 Kubernetes context |
-n, --namespace string | 指定要使用的 Kubernetes namespace |
--no-warn | 为 true 时,切换到与上次不同的 namespace 或 kube-context 部署/操作时不再警告 |
-p, --profile strings | 要应用的 DevSpace profile,多个 profile 按指定顺序依次应用 |
--profile-parent strings | 应先于指定 profile 应用的一个或多个父 profile(如devspace dev --profile-parent=base1 --profile-parent=base2 --profile=my-profile) |
--profile-refresh | 为 true 时会重新拉取并下载 profile 父级源 |
--restore-vars | 为 true 时,在加载配置前先从 Kubernetes 恢复变量 |
--save-vars | 为 true 时,在加载配置后将变量保存到 Kubernetes |
--silent | 静默运行,除 panic 与 fatal 外不输出任何日志 |
-s, --switch-context | 已废弃(DEPRECATED):切换并使用上次部署该项目所用的 kube context 和 namespace |
--var strings | 运行时覆盖变量(如--var=MYVAR=MYVALUE) |
--vars-secret string | 启用--restore-vars或--save-vars时用于存取变量的 Secret 名称(默认devspace-vars) |
对清理命令而言,最常用的通常是-n/--namespace、--kube-context(决定去哪个命名空间查找本地 registry)和--config(指定配置文件位置)。
devspace cleanup images:清理本地 Docker 镜像
适用场景
如果你经常通过devspace build构建镜像,本地 Docker 守护进程里可能已经堆满了大量带不同 tag 的镜像(例如带${devspace.git.commit}、random-####这类 schema 标签)。devspace cleanup images会删除devspace.yaml中images配置段声明的所有镜像,再清理所有 dangling 镜像。
执行流程(源码级解读)
核心逻辑位于 RunCleanupImages,完整调用链如下:
- 定位项目:通过
configLoader.SetDevSpaceRoot(log)找到devspace.yaml所在的项目根目录;如果找不到配置,直接返回message.ConfigNotFound错误——因此该命令必须在包含devspace.yaml的项目目录下运行; - 创建客户端:先根据
--kube-context/-n创建 kube 客户端,再通过 docker.NewClientWithMinikube 创建 Docker 客户端,且preferMinikube=true——即如果当前集群是 minikube,会优先把构建/删除操作落到 minikube 虚拟机内的 Docker 守护进程,失败时回退到本机环境; - 加载配置:
configLoader.Load(...)解析并合并出最终配置。若len(config.Images) == 0,直接输出No images found in config to delete并结束; - 连通性检查:
client.Ping(ctx)失败时报错Docker seems to be not running: ...,即要求本地(或 minikube 内的)Docker 守护进程处于运行状态; - 逐镜像删除:遍历
config.Images,对每个imageConfig.Image(镜像仓库与名称)调用 DeleteImageByName。
底层删除的实现值得注意,见 DeleteImageByFilter:
// pkg/devspace/docker/images.go func (c *client) DeleteImageByFilter(ctx context.Context, filter filters.Args, log log.Logger) ([]image.DeleteResponse, error) { summaries, err := c.ImageList(ctx, image.ListOptions{Filters: filter}) // ... for _, summary := range summaries { deleteResponse, err := c.ImageRemove(ctx, summary.ID, image.RemoveOptions{ PruneChildren: true, // 级联清理因删除该镜像而失效的子层/子镜像 Force: true, // 强制删除,即使有容器依赖 }) // ... } }即先按reference过滤出镜像,再逐个ImageRemove,并且带Force与PruneChildren选项,保证构建产生的中间层也会被连带回收。日志中会区分输出Deleted xxx(真正删除)与Untagged xxx(仅移除 tag)。
- 循环清理 dangling 镜像:
// cmd/cleanup/images.go L111-L128 for { response, err := client.DeleteImageByFilter(ctx, filters.NewArgs(filters.Arg("dangling", "true")), log) // ... if len(response) == 0 { break } }命令以dangling=true过滤反复删除悬空镜像,直到一轮没有任何可删项为止,最终输出Successfully cleaned up images。
用法示例
# 在包含 devspace.yaml 的项目目录下 devspace cleanup images # 指定配置文件 devspace cleanup images --config ./devspace.dev.yaml # 若镜像构建在 minikube 的 docker 中,会优先清理 minikube 内的镜像 devspace cleanup images --kube-context minikube对应的镜像声明来自devspace.yaml的images段(详见 images 配置参考):
images: backend: image: ghcr.io/org/project/image # cleanup images 会删除该镜像在本地的副本 tags: - latest - dev-${devspace.git.commit} dockerfile: ./Dockerfiledevspace cleanup local-registry:删除集群中的本地镜像仓库
背景:Local Registry 是什么
当本地环境没有目标镜像仓库的推送权限时,DevSpace 的降级策略是:如果目标是 KinD 集群,则用kind load docker-image直接载入;其他集群则由 DevSpace 在集群内部署一个本地镜像仓库(Local Registry),并把项目里的所有镜像地址透明改写为localhost:[NODE_PORT]/...(不修改磁盘上的devspace.yaml)。更多细节可参考 Local Registry 配置文档。
这个本地 registry 默认以registry:2.8.1镜像、emptyDir卷 +Deployment的方式部署(启用persistence时改为StatefulSet+ 持久卷)。当你要卸载它(例如切换到有真实仓库权限的环境、或回收集群存储)时,就使用devspace cleanup local-registry。
相关默认值定义在 localregistry 包的 Options:
// pkg/devspace/build/localregistry/options.go RegistryName = "registry" // 资源默认名称 RegistryImage = "registry:2.8.1" BuildKitImage = "moby/buildkit:master-rootless" RegistryPort = 5000 RegistryDefaultStorage = "5Gi" // persistence 默认卷大小devspace.yaml中可通过localRegistry段覆盖这些默认值:
localRegistry: name: registry # 资源名(默认 registry) namespace: [KUBE CONTEXT NAMESPACE] # 部署命名空间 localbuild: false # true 时使用本地 docker/podman 构建再推送 image: registry:2.8.1 # registry 镜像 port: 5000 # 容器端口 persistence: enabled: true # true 时改为 StatefulSet + PVC size: 10Gi storageClassName: "" # 为空则用集群默认 StorageClass执行流程(源码级解读)
核心逻辑位于 RunCleanupLocalRegistry,流程比cleanup images多了一层"破坏性操作确认":
定位项目并加载配置:同样要求存在
devspace.yaml,否则报ConfigNotFound;同时通过LoadLocalCache()读取本地缓存,用kubectl.CheckKubeContext校验当前 kube-context / namespace 是否与上次部署一致(可用--no-warn关闭警告、-s/--switch-context自动切回上次上下文);探测 registry 资源是否存在:结合
config.LocalRegistry与 NewDefaultOptions 得到资源名与命名空间,然后分别Get该命名空间下同名的StatefulSet、Deployment和Service(见 local_registry.go L97-L130):- 三者都不存在时,输出
No local registry found.并安全退出; - 任一存在则继续下一步;
- 三者都不存在时,输出
交互确认:由于删除 registry 会连同其中所有镜像一起消失,命令会弹出确认问题:
This will delete your local registry and all the images it contains. Do you wish to continue? (Yes / No)选择
No直接取消,不产生任何删除动作;按存在情况删除:分别删除检测到的
StatefulSet、Deployment、Service,对IsNotFound错误做幂等容错(并发或重复执行不会报错),最终输出Successfully cleaned up local registry。
用法示例
# 删除默认命名空间中的本地 registry devspace cleanup local-registry # 明确指定 registry 所在命名空间与 context devspace cleanup local-registry -n dev --kube-context my-cluster # 使用特定配置 devspace cleanup local-registry --config devspace.yaml与其他清理类命令的关系
devspace cleanup专注于"镜像与本地 registry"两类资源。DevSpace 文档的 Cleanup 指南 还介绍了其他几类互补的清理手段,可与之搭配使用:
| 命令 | 用途 |
|---|---|
devspace reset pods | 还原dev(start_dev)注入 dev 容器后的改动,恢复为原始部署形态 |
devspace purge | 从集群中移除该项目的所有部署 |
devspace reset vars | 重置你在 DevSpace 中设置过的变量值 |
devspace cleanup images | 删除本地 Docker 中项目声明的镜像及 dangling 镜像 |
devspace cleanup local-registry | 删除集群中的本地镜像仓库(含其中全部镜像) |
实践注意事项
- 两个子命令都要求项目目录下存在
devspace.yaml,否则返回ConfigNotFound;--config可用于显式指定配置文件。 devspace cleanup images只删除images配置段声明的镜像名以及 dangling 镜像,不会误删项目中未声明的其他本地镜像;它要求 Docker 守护进程可达(minikube 场景优先使用 VM 内的 Docker),否则会报Docker seems to be not running。devspace cleanup local-registry是破坏性操作:会删除 registry 内的全部镜像,且命令内置了交互式确认;它只会删除名为localRegistry.name(默认registry)的 StatefulSet/Deployment/Service,不影响集群中其他资源。- 命名空间一致性很关键:registry 部署在哪个 namespace,清理时就需要用
-n/--namespace(或--switch-context切回)指向同一命名空间,否则可能探测不到资源。若确认目标无误,可加--no-warn跳过上下文切换警告。 - 子命令帮助文本可分别在 devspace_cleanup_images.md 与 devspace_cleanup_local-registry.md 中查阅;父命令帮助见 devspace_cleanup.md。
- 云原生
- 开发工具
- DevOps
- 容器编排
【免费下载链接】devspace
DevSpace - The Fastest Developer Tool for Kubernetes ⚡ Automate your deployment workflow with DevSpace and develop software directly inside Kubernetes.
相关推荐
DevSpace 清理本地 Docker 镜像:`devspace cleanup images` 命令完整指南
DevSpace 清理本地 Docker 镜像: devspace cleanup images 命令完整指南 devspace cleanup images
云原生开发工具DevOps容器编排DevSpace cleanup local-registry 命令详解:删除 Kubernetes 集群内本地镜像仓库的完整指南
DevSpace cleanup local registry 命令详解:删除 Kubernetes 集群内本地镜像仓库的完整指南 导读 devspace cl
云原生开发工具DevOps容器编排devspace cleanup images 命令详解:一键清理本地 Docker 构建镜像
devspace cleanup images 命令详解:一键清理本地 Docker 构建镜像 DevSpace 是面向 Kubernetes 的开发者工具,它
云原生开发工具DevOps容器编排
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考