数据卷本质是宿主机上的目录/文件,即便关联的容器已删除,数据卷内数据仍会永久占用磁盘空间。
数据卷默认存储在 Podman 的专属目录(/var/lib/containers/storage/volumes/,root 模式)或用户目录($HOME/.local/share/containers/storage/volumes/,rootless 模式)。
下面我会详细讲解各种删除方式和注意事项。
分别运行 podman volume rm --help 和 podman volume prune --help 命令查看命令手册:
(1)podman volume rm 命令手册
C:\Users\Administrator> podman volume rm --help 删除一个或多个数据卷 说明: 删除一个或多个已存在的数据卷。 默认情况下,仅删除未被任何容器使用的数据卷。若需强制删除(无论是否被使用), 请使用 --force 参数。 用法: podman volume rm [选项] 数据卷 [数据卷...] 别名: rm, remove 示例: podman volume rm myvol1 myvol2 podman volume rm --all podman volume rm --force myvol 选项: -a, --all 删除所有数据卷 -f, --force 强制删除数据卷,即使该卷正被容器使用 -t, --time int 终止运行中的容器前等待的秒数(超时则强制终止容器)(默认值:10)
(2)podman volume prune 命令手册
C:\Users\Administrator> podman volume prune --help 删除所有未使用的数据卷 说明: 当前未被任何容器占用的数据卷将会被移除。 该命令会提示确认操作,可通过 --force 标志跳过确认步骤。 注意:所有数据将会被永久删除。 用法: podman volume prune [选项] 选项: --filter stringArray 提供过滤条件(例如:'label=<键>=<值>') -f, --force 不提示确认直接执行
删除指定名称的数据卷,使用 podman volume rm 命令:
# 删除单个数据卷 podman volume rm my_volume # 实例: C:\Users\Administrator> podman volume rm my_volume my_volume # 删除多个数据卷(空格分隔) podman volume rm volume1 volume2 volume3
如果数据卷仍被容器使用,普通删除会失败,可使用 --force/-f 参数强制删除:
# 强制删除被占用的数据卷 podman volume rm -f my_volume # 使用普通方式删除,报错了 C:\Users\Administrator> podman volume rm redis-data Error: volume redis-data is being used by the following container(s): 2a3f65e28721e42bcdaabab55e4b8a625a3f78b0cec73033a9f8be2b429b8861: volume is being used # 强制删除 C:\Users\Administrator> podman volume rm -f redis-data redis-data
⚠️ 警告:强制删除可能导致正在使用该卷的容器出现异常,建议先停止并删除关联容器。
使用 podman volume prune 命令可以自动清理所有未被任何容器(包括已停止容器)使用的 "孤儿卷":
# 交互式清理(会提示确认) podman volume prune # 实例: C:\Users\Administrator> podman volume prune WARNING! This will remove all volumes not used by at least one container. The following volumes will be removed: 55721eeb6f6f208acdea7cd3cd2d464945ad3fd5367263685c158dc61bea7171 6233bc6b7031724a212b0ce80956619313c74c2d0ca01474ed349d4b6a5e0465 75ea3e45783042a8333d94838ff4bb38001411d065f0cde73ff775465ae67853 nginx-conf mydata 324a6d248cda8803d130aa2917bc6fe31c1ba35121420fbfdc523d18c41fbb9b 1cbe65f784c4bb2f774e63c612f62e99d1316b27975ebda62f7040d46b964d1a nfs_volume db_volume user_volume Are you sure you want to continue? [y/N] # 非交互式清理(直接删除,无需确认) podman volume prune -f # 实例: C:\Users\Administrator> podman volume prune -f 55721eeb6f6f208acdea7cd3cd2d464945ad3fd5367263685c158dc61bea7171 6233bc6b7031724a212b0ce80956619313c74c2d0ca01474ed349d4b6a5e0465 75ea3e45783042a8333d94838ff4bb38001411d065f0cde73ff775465ae67853 nginx-conf mydata 324a6d248cda8803d130aa2917bc6fe31c1ba35121420fbfdc523d18c41fbb9b 1cbe65f784c4bb2f774e63c612f62e99d1316b27975ebda62f7040d46b964d1a nfs_volume db_volume user_volume
结合过滤参数,可以删除符合特定条件的数据卷,适合 Linux 系统:
# 删除所有标签为 environment=test 的数据卷 podman volume rm $(podman volume ls -q --filter label=environment=test) # 实例: # 1.查看数据卷名称包含 data 字符串的数据卷名称列表 [user@localhost ~]$ podman volume ls -q --filter name=data redis-data mysql-data # 批量删除数据卷 [user@localhost ~]$ podman volume rm $(podman volume ls -q --filter name=data) redis-data mysql-data # 如果没有匹配的数据卷,将会抛出错误 [user@localhost ~]$ podman volume rm $(podman volume ls -q --filter label=environment=test) Error: choose either one or more volumes or all # 删除名称包含特定前缀的所有数据卷 podman volume rm $(podman volume ls -q --filter name=temp_) # 删除所有本地驱动的数据卷 podman volume rm $(podman volume ls -q --filter driver=local)
为了安全删除数据卷,建议遵循以下步骤:
# 1. 查找使用该数据卷的容器 podman ps -a --filter volume=redis-data # 实例: [user@localhost ~]$ podman ps -a --filter volume=redis-data CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7f2c1b020751 docker.io/library/redis:latest redis-server --ap... About a minute ago Up About a minute 0.0.0.0:6379->6379/tcp redis # 2. 停止关联容器 podman stop $(podman ps -a --filter volume=redis-data -q) # 实例: [user@localhost ~]$ podman stop $(podman ps -a --filter volume=redis-data -q) 7f2c1b020751 # 3. 删除关联容器 podman rm $(podman ps -a --filter volume=redis-data -q) # 实例: [user@localhost ~]$ podman rm $(podman ps -a --filter volume=redis-data -q) 7f2c1b020751 # 4. 删除数据卷 podman volume rm redis-data # 实例: [user@localhost ~]$ podman volume rm redis-data redis-data
情况 1:数据卷被挂载到运行中的容器
# 错误信息:Error: volume is being used by the following containers: [...] # 解决方法:先停止并删除关联容器 # 1.停止容器 podman stop container_id # 2.删除容器 podman rm container_id # 3.删除数据卷 podman volume rm my_volume
情况 2:数据卷被挂载到已停止但未删除的容器
# 解决方法:删除关联的已停止容器 # 1.删除容器 podman rm container_id # 2.删除数据卷 podman volume rm my_volume
情况 3:文件系统问题导致删除失败
# 解决方法:手动清理(需谨慎)
# 1. 查看数据卷的实际路径
podman volume inspect -f "{{.Mountpoint}}" my_volume
# 2. 手动删除目录(确保已备份)
sudo rm -rf /var/lib/containers/storage/volumes/my_volume
# 3. 刷新 Podman 缓存
podman system prune -f