【问题标题】:Docker rails app wont talk to postgresql databaseDocker rails 应用程序不会与 postgresql 数据库对话
【发布时间】:2021-11-05 14:46:42
【问题描述】:

我一直在尝试在 docker 上设置我的 rails 项目以及 postgres 数据库,但由于某种原因,我的 rails 项目无法连接到数据库

我可以使用像 Psequel 这样的数据库工具连接到数据库,从而证明数据库实际上正在运行并且良好。但是由于某些奇怪的原因,我的 rails 应用程序无法连接到数据库。这是我得到的错误

PG::ConnectionBad: could not connect to server: Connection refused
        Is the server running on host "localhost" (127.0.0.1) and accepting
        TCP/IP connections on port 5435?
 could not connect to server: Address not available
        Is the server running on host "localhost" (::1) and accepting
        TCP/IP connections on port 5435?

以下是 docker compose 文件。

version: "3"

networks:
  app:
    driver: bridge

volumes:
  database:
  abc-database:

services:
  testproject:
    networks:
      app:
        aliases:
          - testproject
    image: 34543.aws.testprojectimage:ac877887
    environment: 
      DATABASE_HOST: localhost
      # DATABASE-HOST: abc-db
      DATABASE_USER: test
      DATABASE_PASSWORD: testpass
      DATABASE_NAME: abc
      DATABASE_PORT: 5435
      # DATABASE_URL: postgres://test:testpass@localhost:5435/abc
      LOCAL_TESTS: 1
    ports:
    - 4000:3000/tcp
    depends_on: 
      - "abc-database"

  abc-database:
    container_name: abc-db
    networks:
      app:
        aliases:
          - abc-db
    image: postgres:10.5
    environment:
      POSTGRES_PASSWORD: testpass
      POSTGRES_USER: test
      POSTGRES_DB: abc
    ports:
       - 5435:5432
    # volumes:
    #   - abc-database:/var/lib/postgresql/data
  • 我试图通过运行docker exec -it testproject sh 进入容器并执行手动活动记录连接来确保连接对象具有正确的凭据,并且所有凭据都是正确的。但是连接失败并出现上述相同的错误。

  • 我也尝试在环境变量中使用 database_url,但也没有用。

  • 我为 postgres 数据库使用了一个卷,但为了排除 postmaster 文件出现问题的可能性,我将其删除,因此每次启动项目时都会设置一个新数据库。但我继续得到同样的错误

  • 我尝试将abc-db 用作DATABASE-HOST,但效果不佳

非常感谢任何建议。谢谢。

【问题讨论】:

  • 你需要使用另一个容器的Compose服务名abc-database和标准的MySQL端口5432; ports: 未在此处使用(也不是必需的)。您还可以删除 container_name:networks: 设置以简化操作。

标签: ruby-on-rails postgresql docker docker-compose dockerfile


【解决方案1】:

docker-compose 正在为docker-compose 文件中描述的每个服务创建域别名,因此数据库连接的主机名必须与数据库服务名称相同,在您的情况下为 abc-database

【讨论】:

    【解决方案2】:

    感谢大家的帮助。我能够让它工作。问题出在港口。我最初设置了端口的外部到内部映射,但我很高兴只使用 5432。我还从那里删除了所有不需要的行。这对我有用。

    version: "3"
    
    
    services:
      test-project:
        image: 87678.image-aws.com/78677777678
        environment: 
          SWAGGER_HOST: localhost:3000
          SWAGGER_PROTO: http
          MINIO_ENDPOINT: http://127.0.0.1:9000
          DEFAULT_MAILER_SENDER: no-reply@URL_OF_STACK_HERE.com
          PRODUCTION_HOST: project-latest.org-qa.com
          CHROMEDRIVER_VERSION: '91.0.4472.101'
          DATABASE_HOST: abc-database
          DATABASE_USER: test
          DATABASE_PASSWORD: testpass
          DATABASE_NAME: test
          DATABASE_PORT: 5432
        ports:
        - 3000:3000/tcp
        depends_on: 
          - "abc-database"
    
      abc-database:
        image: postgres:10.5
        environment:
          POSTGRES_PASSWORD: testpass
          POSTGRES_USER: test
          POSTGRES_DB: test
    
    

    我删除了一些与项目相关的不需要的环境变量。只是为了让项目细节保持匿名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      相关资源
      最近更新 更多