You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ddev Snapshot执行失败,报bash‘Is a directory’错误求助

问题

我维护多个DDEV站点,每个站点对应多个Git分支,每个分支都有专属快照。切换分支前,我会先删除原有快照再创建新快照,但部分分支会随机出现ddev snapshot执行失败的情况,报错核心信息如下:

bash: /var/tmp/main-mysql_5.7.gz: Is a directory
Failed to create snapshot: composeCmd failed to run '[执行命令]', err='exit status 1', stderr='bash: /var/tmp/main-mysql_5.7.gz: Is a directory'

问题出在执行以下快照处理脚本时:

# Delete snapshot...
verbose "$LINENO" "ddev snapshot --cleanup --name $SNAPSHOT"
echo -e "/usr/bin/ddev snapshot --cleanup --name $SNAPSHOT" >> "$LOG"
/usr/bin/ddev snapshot --cleanup --name "$SNAPSHOT"

verbose $LINENO
separator
# Create snapshot...
verbose "$LINENO" "ddev snapshot --name=$SNAPSHOT"
echo -e "/usr/bin/ddev snapshot --name=$SNAPSHOT" >> "$LOG"                                                                         
/usr/bin/ddev snapshot --name="$SNAPSHOT"

解决方案

报错的核心原因是DDEV创建快照时,目标路径/var/tmp/[快照名]-mysql_*.gz被意外创建成了目录而非文件。需要在脚本中新增预清理步骤,彻底清除容器内的异常残留。

修改后的脚本如下:

# Delete snapshot...
verbose "$LINENO" "ddev snapshot --cleanup --name $SNAPSHOT"
echo -e "/usr/bin/ddev snapshot --cleanup --name $SNAPSHOT" >> "$LOG"
/usr/bin/ddev snapshot --cleanup --name "$SNAPSHOT"

# 新增:强制清理容器内可能残留的异常快照文件/目录
verbose "$LINENO" "Cleaning up invalid snapshot artifacts in db container"
echo -e "/usr/bin/ddev exec db 'rm -rf /var/tmp/${SNAPSHOT}-mysql_*.gz'" >> "$LOG"
/usr/bin/ddev exec db "rm -rf /var/tmp/${SNAPSHOT}-mysql_*.gz"

verbose $LINENO
separator
# Create snapshot...
verbose "$LINENO" "ddev snapshot --name=$SNAPSHOT"
echo -e "/usr/bin/ddev snapshot --name=$SNAPSHOT" >> "$LOG"                                                                         
/usr/bin/ddev snapshot --name="$SNAPSHOT"

修改说明

  1. 强制清理残留:通过ddev exec db进入数据库容器,用rm -rf彻底删除/var/tmp/下对应快照名的所有mysql_*.gz相关文件/目录,避免异常目录干扰新快照创建。
  2. 通配符兼容:用${SNAPSHOT}-mysql_*.gz匹配不同MySQL版本的快照文件(如mysql_5.7.gz、mysql_8.0.gz),适配多版本环境。
  3. 容错性保障:rm -rf命令在目标路径不存在时不会报错,不会中断脚本执行流程。

可选优化:在脚本开头增加容器状态检查,确保数据库容器正常运行:

# 检查db容器是否正常运行,异常则启动
if ! /usr/bin/ddev status | grep -q "db.*running"; then
    verbose "$LINENO" "db container not running, starting site..."
    /usr/bin/ddev start --no-snapshot
fi

内容的提问来源于stack exchange,提问作者misthufe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:52:48