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

Rails应用连接Docker中PostgreSQL数据库失败问题排查

问题分析与解决办法

错误原因

host.docker.internal 解析失败,通常由以下两种场景导致:

  1. Rails应用在宿主机运行,PostgreSQL在Docker容器中:该域名是Docker Desktop专属的宿主机别名,在Linux原生Docker环境(非Docker Desktop)、部分Windows/Linux配置下可能无法正常解析;
  2. Rails和PostgreSQL都在Docker容器中:host.docker.internal指向的是宿主机而非PostgreSQL容器,因此无法连接到容器内的数据库。

针对性解决办法

场景1:Rails在宿主机,PostgreSQL在Docker容器

  • 替换host为localhost:前提是启动PostgreSQL容器时已将5432端口映射到宿主机,启动命令示例:

    docker run -d -p 5432:5432 -e POSTGRES_USER=your_user -e POSTGRES_PASSWORD=your_pass postgres:latest
    

    同时需确保PostgreSQL允许外部连接:

    • 进入容器修改/var/lib/postgresql/data/pg_hba.conf,添加一行:host all all 0.0.0.0/0 md5
    • 修改postgresql.conf,设置listen_addresses = '*'
      (也可通过挂载配置文件的方式持久化这些设置,避免容器重启后失效)
  • 直接使用PostgreSQL容器的IP:执行以下命令获取容器IP:

    docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <postgres容器名/ID>
    

    将得到的IP填入database.yml的host字段即可。

场景2:Rails和PostgreSQL都在Docker容器

  • 使用Docker容器名/服务名作为host:
    推荐用docker-compose管理,创建docker-compose.yml示例:

    version: '3.8'
    services:
      postgres:
        image: postgres:latest
        environment:
          POSTGRES_USER: <%= ENV['DATABASE_USERNAME'] %>
          POSTGRES_PASSWORD: <%= ENV['DATABASE_PASSWORD'] %>
        volumes:
          - postgres_data:/var/lib/postgresql/data
      web:
        build: .
        command: bundle exec rails s -b 0.0.0.0
        volumes:
          - .:/app
        ports:
          - "3000:3000"
        depends_on:
          - postgres
        environment:
          DATABASE_USERNAME: <%= ENV['DATABASE_USERNAME'] %>
          DATABASE_PASSWORD: <%= ENV['DATABASE_PASSWORD'] %>
    volumes:
      postgres_data:
    

    此时将database.yml的host字段改为postgres(对应docker-compose里的服务名),两个容器会自动加入同一网络,可直接通过服务名通信。

    若不用docker-compose,可手动创建Docker网络并将两个容器加入:

    docker network create myapp-network
    docker run -d --name postgres --network myapp-network -e POSTGRES_USER=xxx -e POSTGRES_PASSWORD=xxx postgres:latest
    docker run -d --name rails-app --network myapp-network ... # 你的Rails容器启动命令
    

    随后database.yml的host填postgres(容器名)即可。

是否需要docker-compose和Dockerfile?

  • Dockerfile:如果要将Rails应用打包成Docker镜像并在容器中运行,就需要编写Dockerfile;若Rails始终在宿主机本地运行,则不需要。
  • docker-compose:并非强制要求,但它可以一键管理多容器的网络、环境变量、依赖关系,比手动逐个启动容器更高效,适合长期开发环境。

内容的提问来源于stack exchange,提问作者sara lance

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:08:19