从`podman/docker export`流中排除目录并保存到文件

问题描述 投票:0回答:1

(这是由于不活动问题而自动删除的副本,我找到了答案,但无法取消删除它,所以我重新创建了它)

我有一个容器,我想将其导出为

.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,因为它们的导出命令完全相同,并且对于可搜索性很有用)

docker containers tar podman
1个回答
0
投票

这个答案的启发,我发现

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

通常使用

*
的全局扩展也支持作为模式匹配的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.