Podman 教程

Podman 数据卷删除

数据卷本质是宿主机上的目录/文件,即便关联的容器已删除,数据卷内数据仍会永久占用磁盘空间。

数据卷默认存储在 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

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号