Laravel集成Minio调用PutObject失败:连接被拒绝求助
排查Minio无法上传文件的问题
核心问题分析
从报错和现象来看,容器网络内的DNS解析失败是主要原因:
- Laravel Sail的PHP容器无法解析
images.localhost或localhost:9000到Minio容器,导致连接拒绝 - 桶名长度影响请求URL格式(虚拟主机/路径模式),但本质都是容器间通信的地址错误
1. 修正.env配置(关键步骤)
修改.env中的Minio相关配置,改用Docker服务名进行容器间通信:
AWS_ACCESS_KEY_ID=sail AWS_SECRET_ACCESS_KEY=password AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET=images AWS_USE_PATH_STYLE_ENDPOINT=true # 强制路径模式,避免子域名解析问题 AWS_ENDPOINT=http://minio:9000 # 用Minio容器的服务名(Sail默认服务名为minio) AWS_URL=http://minio:9000/images
2. 验证Minio容器状态与连通性
检查Minio容器是否正常运行:
sail ps确认Minio容器状态为
Up在PHP容器内测试与Minio的连通性:
sail exec laravel.test curl http://minio:9000/minio/health/live返回
OK则说明连通正常检查Minio存储卷的磁盘空间与权限:
sail exec minio df -h
3. 清除配置缓存并验证
清除Laravel配置缓存:
sail artisan config:clear用Tinker测试文件上传:
sail artisan tinker执行测试代码:
Storage::disk('s3')->put('test_upload.jpg', file_get_contents('/var/www/html/public/favicon.ico'));无报错则说明上传功能恢复
4. 补充说明
- 为什么之前正常现在失效?大概率是Docker网络重启后,容器DNS缓存更新,导致原
localhost映射失效(容器内的localhost指向自身,而非宿主机) - 强制启用
AWS_USE_PATH_STYLE_ENDPOINT=true可以避免AWS SDK根据桶名自动切换虚拟主机模式,彻底解决子域名解析问题
内容的提问来源于stack exchange,提问作者piotr
相关产品推荐
相关产品推荐

