使用Kamal v2部署Rails 8应用时遇ActiveRecord适配器未指定错误
Rails 8 + Kamal v2
kamal setup 数据库适配器错误解决思路 1. 检查 database.yml 的适配器配置
确保你的database.yml中生产环境明确指定Postgres适配器,避免遗漏或拼写错误:
production: adapter: postgresql database: <%= ENV.fetch("DATABASE_NAME") { "your_app_production" } %> username: <%= ENV.fetch("DATABASE_USERNAME") { "postgres" } %> password: <%= ENV.fetch("DATABASE_PASSWORD") %> host: <%= ENV.fetch("DATABASE_HOST") { "db" } %> port: <%= ENV.fetch("DATABASE_PORT") { 5432 } %> encoding: unicode pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
- 重点确认
adapter: postgresql行存在,不要写成postgres - 所有依赖的环境变量要能在容器中正常读取
2. 验证 Kamal deploy.yml 的数据库映射
Kamal需要正确传递数据库配置到容器,确保deploy.yml包含以下关键配置:
services: web: image: your-app-image env: clear: RAILS_ENV: production secret: - DATABASE_PASSWORD - RAILS_MASTER_KEY depends_on: - db db: image: postgres:16-alpine env: clear: POSTGRES_DB: your_app_production POSTGRES_USER: postgres secret: - POSTGRES_PASSWORD volumes: - db_data:/var/lib/postgresql/data
- 确认
db服务的POSTGRES_DB、POSTGRES_USER与database.yml中的环境变量对应 - 检查
web服务的depends_on包含db,保证容器启动顺序正确
3. 排查 Postgres 容器退出码255的原因
退出码255通常是启动权限或配置错误,先查看容器日志定位问题:
kamal logs db
常见修复方案:
- 数据卷权限问题:清理旧数据卷后重新部署
kamal volume rm db_data kamal setup - 密码配置错误:确保
POSTGRES_PASSWORD非空且符合Postgres规则 - 端口冲突:修改
deploy.yml中的端口映射,避免宿主机5432端口被占用db: ports: - "5433:5432"
4. 验证容器内环境变量加载
进入web容器,检查数据库相关环境变量是否存在:
kamal exec web printenv | grep DATABASE_
- 如果变量缺失,检查
deploy.yml的secret配置是否正确引用本地.env文件,或Kamal密钥管理是否配置正常 - 确认
RAILS_ENV设置为production,避免加载错误的数据库配置
5. 手动执行数据库准备命令调试
在web容器中手动运行db:prepare,获取更详细的错误信息:
kamal exec web bundle exec rails db:prepare
根据输出的具体提示,进一步定位环境变量未加载、数据库连接超时等问题
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

