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

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是编译mysql2 gem所需的开发库,若你是在容器内编译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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:00:57