(这是由于不活动问题而自动删除的副本,我找到了答案,但无法取消删除它,所以我重新创建了它)。
我有一个容器,我想将其导出为
.tar
文件。我使用了 podman run
和 tar --exclude=/dir1 --exclude=/dir2 …
输出到位于绑定安装的主机目录上的文件。但最近这个 给了我一些 tar: .: file changed as we read it
错误,而 podman/docker export
可以避免这些错误。此外,我认为export
更有效率。因此,我尝试迁移到使用 export
,但主要障碍是我似乎找不到从 tar 流中排除路径的方法。
如果可能,我想避免修改已保存在磁盘上的 tar 存档,而是在将流保存到文件之前对其进行修改。
我已经敲了好几个小时的头,尝试来自 ChatGPT 的无用建议,查看
cpio
,并尝试将 podman export
传输到 tar --exclude …
命令。对于最后一个,我确实在某些时候取得了小小的成功,但无法使 tar 将结果保存到特定命名的文件中。
有什么建议吗?
(注意:这里我不区分 docker 和 podman,因为它们的导出命令完全相同,并且对于可搜索性很有用)
受这个答案的启发,我发现
bsdtar
(与通常的tar
相反)确实能够过滤掉来自stdin
的文件。它是通过传递“写入标准输出”的 -f -
和“从标准输入读取”的 @-
来实现的。
所以,假设我想过滤掉所有包含
etc
和 lib64
的目录,然后我执行:
λ podman export frosty_banach | bsdtar -czf - --exclude="etc" --exclude="lib64" @- > foo.tar.gz
λ tar tf foo.tar.gz | grep -P "\betc|lib64"
# no matches, the dirs were filtered out successfully
通常使用
*
的全局扩展也支持作为模式匹配的一部分。