Kamal部署报错:libmariadb.so.3缺失致Rails健康检查失败
问题排查与解决步骤
1. 先定位核心错误根源
日志里的LoadError: libmariadb.so.3: cannot open shared object file是关键——这是Ruby的mysql2 gem在加载时找不到运行依赖库,和MySQL服务器本身无关,问题出在应用容器的环境缺失,直接导致Rails应用启动失败,进而3000端口无监听,触发健康检查失败。
2. 修复应用容器的依赖缺失
修改Dockerfile添加依赖
在你的Rails项目Dockerfile中,安装MariaDB客户端运行时库(Ubuntu 23.10软件源包含该包),示例如下:
# 放在安装gem的步骤之前 RUN apt-get update && apt-get install -y --no-install-recommends \ libmariadb3 \ libmariadb-dev \ && rm -rf /var/lib/apt/lists/*
libmariadb3是运行时依赖,必须安装;libmariadb-dev是编译mysql2gem所需的开发库,若你是在容器内编译gem则需要保留,若使用预编译gem可只保留libmariadb3。
重新构建并部署
执行以下命令更新镜像并重新部署:
kamal build kamal push kamal deploy
3. 若仍存在3000端口无法连接问题,继续排查
当应用容器能正常启动后,再检查端口和路由相关问题:
- 检查应用进程状态:执行
kamal exec app ps aux,确认Rails主进程是否在运行。 - 检查容器内端口监听:执行
kamal exec app ss -tulpn | grep 3000,确保Rails绑定的是0.0.0.0而非127.0.0.1(默认Rails 7启动时绑定0.0.0.0,若有自定义启动参数需确认)。 - 确认Traefik路由配置:查看
config/deploy.yml,确保应用端口(3000)已正确暴露给Traefik,且Traefik监听外部80/443端口:traefik: ports: - "80:80" - "443:443" app: port: 3000 - 验证MySQL连接可用性:在应用容器内执行
kamal exec app rails db:version,确认数据库地址、用户名、密码配置正确,同时检查MySQL服务器的防火墙是否允许应用服务器IP访问3306端口。
内容的提问来源于stack exchange,提问作者user502052
相关产品推荐
相关产品推荐

