自定义DDEV Provider执行ddev pull拉取数据时报错如何解决?
问题原因及解决方法
核心报错原因
1. 特殊字符未正确转义
你密码中包含$符号,在双引号包裹的SSH命令执行过程中,Bash会将$开头的内容识别为变量尝试解析,你遇到的bash: 03: command not found就是密码中的$03被错误解析、Bash尝试执行03命令导致的。
2. MySQLdump语法错误
最早的配置中-p ${DB_PASSWORD}写法错误,-p参数和密码之间不能有空格,否则MySQLdump会将后面的密码识别为数据库名,执行报错。
3. 命令笔误
你最早配置中scp命令末尾多了多余的.字符,导致路径识别错误,也会触发目录操作相关报错。另外你无需手动创建.downloads目录,DDEV执行ddev pull时会自动生成该目录。
修正后的配置参考
environment_variables: DB_NAME: db_name DB_USER: db_user # 密码中的$需要加反斜杠转义,外层保留单引号包裹 DB_PASSWORD: 'Password\$' HOST_IP: 10.10.10.10 SSH_USERNAME: username SSH_PORT: 21 auth_command: command: | ssh-add -l >/dev/null || ( echo "Please 'ddev auth ssh' before running this command." && exit 1 ) db_pull_command: command: | # 直接通过管道将远程备份输出到本地,无需生成远程临时文件 ssh -p ${SSH_PORT} ${SSH_USERNAME}@${HOST_IP} "mysqldump -h 127.0.0.1 --user=${DB_USER} --password='${DB_PASSWORD}' ${DB_NAME}" | gzip > /var/www/html/.ddev/.downloads/db.sql.gz files_pull_command: command: | # 用rsync替代scp实现增量同步,速度更快 rsync -avz -e "ssh -p ${SSH_PORT}" ${SSH_USERNAME}@${HOST_IP}:/path/to/public/fileadmin/user_upload/ /var/www/html/.ddev/.downloads/files/
额外优化建议
- 优先使用
--user、--password写法代替简写的-u、-p,避免空格导致的语法歧义问题 - 如果变量依然无法正常识别,可以将环境变量添加到项目
.ddev/config.yaml的web_environment配置项中,优先级高于provider内定义的变量 - 确认远程服务器SSH用户对
/tmp目录有读写权限,避免临时文件生成失败
内容的提问来源于stack exchange,提问作者Eluvitie
相关产品推荐
相关产品推荐

