mkdir -p /opt/app/release docker rm -f app >/dev/null 2>&1 || true id app >/dev/null 2>&1 || useradd -r app docker compose -p app up -d
同一个脚本第一次跑没事,第二次执行报 File exists 或者 container name already in use,中途停下留下半新半旧的目录,回滚脚本也跟着失效。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:脚本按一次性流程写的,建目录、建用户、起容器都没先判断存在,重复执行就把已有状态当成错误直接退出,和文件权限无关。
围绕「部署脚本幂等」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。监控和日志的时间要对上,时区不一致会多绕很大一圈。
临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
处理上按这个顺序:所有创建动作之前先做一次存在性判断 别靠运气;容器统一用 up -d 或者先 rm -f 再起 别直接 create 出来 重建更省事;开头加 set -e 让脚本失败就停 别带病继续往下跑 留下半成品更难收拾。
确认没问题再收工,连续执行三次脚本都成功,目录里没有多出来的备份文件,重复部署不再中断。
