如何删除Docker卷的内容?

4
我可以作为一个有用的助手帮您进行翻译。下面是需要翻译的内容:

我有一个由 docker-compose.yml 文件创建的卷。我们称它为 my_volume,与之关联的容器为 my_container。我想脚本化删除该卷的内容。以下所有操作均假设已停止但未删除 my_container 容器。

我可以使用以下命令列出卷的内容:

docker run --rm -v my_volume:/data/ ubuntu ls -la /data

这个方法有效,接下来我尝试使用以下命令删除"data"文件夹的内容:

docker run --rm -v my_volume:/data/ ubuntu rm -rf /data/*

没有报错信息显示,所以看起来一切都成功了,但当我再次列出卷的内容时,卷中的数据并没有被删除。

我可以通过进入容器,然后执行以下操作来完成删除:

docker run --rm -it -v my_volume:/data/ ubuntu /bin/bash

然后从容器内部执行:

rm -rf /data/*

这个方法虽然有效,可以删除内容,但它不可编写脚本。您有什么想法吗?为什么 rm 命令在容器外无法正常使用?如何成功地删除卷的内容?请注意,我不想删除卷并创建一个新的,因为这样会导致删除与卷相关联的原始容器/映像,而这正是我不想做的。谢谢您的帮助!

也许不是你寻找的地方,但你可以使用rm -r /var/lib/docker/volumes/my_volume/_data/*清除你的卷。 - lvthillo
我尝试过的其他方法是 docker run --rm -v my-volume:/data/ ubuntu rm -rf data/,但会出现设备忙的警告/错误。另一个“解决方案”是分别删除所有内容(但只有在您始终知道卷包含什么时才能这样做:docker run --rm -v my-volume:/data/ ubuntu rm -rf data/dir1 data/dir2 data/file1 ..)。 - lvthillo
1个回答

2
有没有想法为什么在容器外使用rm命令时无法正常工作?
我认为正在发生的是,'/data/*'正在主机shell中被评估。因此,容器实际上是使用'rm -rf / data / somefile / data / otherfile ...'命令运行的,并带有主机上/data目录中文件列表。如果这些文件与容器不匹配,则它将看起来没有删除任何内容。
您可以使用单引号来防止在主机shell中发生扩展。
rm -rf '/data/*'

3
Docker似乎将任何引号传递到容器中,否则它会在没有shell扩展的情况下运行,因此您将得到“/data/*”未找到的错误。您可以调用一个shell来为您进行扩展:docker run --rm -v my_volume:/data/ ubuntu /bin/sh -c "rm -rf /data/*" - BMitch

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