YDAY=$(date -u -d @$(( $(date +%s) - 86400 )) +%F)
[ -n "$YDAY" ] || { echo 'date failed'; exit 1; }
tar czf "/backup/${YDAY}_app.tar.gz" /opt/app

备份脚本用 date -d 'yesterday' +%F 生成文件名,Alpine 容器里报 date: invalid date 'yesterday',变量为空,最终生成的文件叫 _app.tar.gz,每天互相覆盖。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,BusyBox 的 date 只支持 -d @时间戳和少量格式,不支持 yesterday 这类自然语言。命令失败后变量是空串,脚本没有检查就拼进文件名。

「date -d 不兼容」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

处理上按这个顺序:改成 date -d @$(( $(date +%s) - 86400 )) 这种时间戳写法;或者用 TZ 加偏移计算;生成后判断文件名非空再继续;在目标镜像里跑一次 确认文件名带日期。

改完只确认一件事:容器里生成的备份文件名带昨天的日期,连续两天不会互相覆盖。

作者 9823189