Laravel 9 Docker环境下Spatie备份包dump_binary_path配置问题
解决Laravel + Docker环境下spatie/laravel-backup调用mysqldump失败的问题
错误原因
执行docker compose exec php php artisan backup:run时,备份命令是在PHP容器内运行的,但mysqldump实际存在于MySQL容器中,PHP容器默认未安装mysql-client工具包,因此找不到/usr/bin/mysqldump路径,触发报错sh: 1: /usr/bin/mysqldump: not found。
解决方案
提供两种可行方案,按需选择:
方法一:在PHP容器中安装mysql-client(推荐简单场景)
直接在PHP容器内安装包含mysqldump的mysql-client包,让PHP容器能直接调用本地的mysqldump:
- 修改PHP服务的Dockerfile(无Dockerfile则新建):
# 基于你的PHP镜像,示例为php:8.1-fpm FROM php:8.1-fpm # 安装mysql-client及依赖 RUN apt-get update \ && apt-get install -y --no-install-recommends mysql-client \ && rm -rf /var/lib/apt/lists/* # 后续添加你的Laravel依赖安装命令(如扩展安装、composer操作等)
- 重构PHP镜像并重启容器:
docker compose build php docker compose up -d php
- 保留
config/database.php中的dump配置不变:
'dump' => [ 'dump_binary_path' => '/usr/bin', 'use_single_transaction', 'timeout' => 60 * 5, ],
方法二:通过Docker exec调用MySQL容器内的mysqldump(适合轻量场景)
若不想增大PHP镜像体积,可让spatie/laravel-backup通过docker exec直接调用MySQL容器内的mysqldump:
- 修改
config/database.php中的mysql dump配置,添加自定义command:
'mysql' => [ // 其余配置保持不变 'dump' => [ 'dump_binary_path' => '', // 清空或删除该配置 'command' => 'docker exec mysql /usr/bin/mysqldump', // 替换为你的MySQL容器名 'use_single_transaction', 'timeout' => 60 * 5, ], // 其余配置保持不变 ],
- 给PHP容器添加Docker权限:
在docker-compose.yml的PHP服务中挂载宿主机的docker.sock,让PHP容器能执行docker命令:
php: // 其余配置保持不变 volumes: - /var/run/docker.sock:/var/run/docker.sock // 你的其他挂载路径
- 重启PHP容器:
docker compose restart php
验证
执行备份命令测试是否正常:
docker compose exec php php artisan backup:run
内容的提问来源于stack exchange,提问作者Kmaj
相关产品推荐
相关产品推荐

