有没有办法创建一个.tar
文件,省略其文件/目录的atime / ctime / mtime值?
我们在构建过程中有一个步骤,它生成一个工件目录,该目录被打包到tarfile中。我们希望构建步骤是幂等的 - 给定相同的输入,它每次都会产生完全相同的文件/输出。
理想情况下,我们还希望在干净的构建中使用按位幂等步骤,以便我们可以使用连续构建的哈希来检查没有任何更改。但是因为tar文件包含每个条目的时间戳(atime / ctime / mtime),所以该构建步骤创建的tar文件永远不会与上一次运行相同,即使存档中的每个文件的内容都是按位相同。
有没有办法生成一个省略其条目时间戳的tarfile,以便生成存档的步骤可以是按位幂等的? (我们希望利用tar
保留的其他文件元数据,例如文件模式位和符号链接。)
答案 0 :(得分:14)
GNU tar有一个--mtime
参数,可用于在归档中存储固定日期,而不是文件的实际mtime:
tar --mtime='1970-01-01' input ...
使用gzip压缩tarball时,还需要指定-n
以防止存储tar存档的名称和时间戳:
tar --mtime='1970-01-01' input ... | gzip -n >input.tar.gz
答案 1 :(得分:1)
要拥有真正等幂的tar,mtime
是一个很好的步骤,但还不够。
您还需要为mtime
设置排序顺序,所有者和组(以及它们的映射)和正确的时区(否则,在Mac和Linux之间也会出现问题)。
我最终以
tar --sort=name --owner=root:0 --group=root:0 --mtime='UTC 2019-01-01' ... | gzip -n
答案 2 :(得分:-3)
我们可以在没有附加时间戳的情况下创建tar文件。
1)创建没有压缩和时间戳的tar文件
Dockerfile
2)使用压缩创建tar文件,没有时间戳
tar -cf file_name.tar file_name
3)替代方式
tar -cf file_name | gzip -n > file_name.tar.gz
注意:' -n'不会添加时间戳和名称
4)提取tar文件
GZIP=-n tar -czf file_name.tar.gz file_name
验证您可以这样做
tar -xf file_name.tar and tar -xzf file_name.tar.gz