【问题标题】:Postgres issue - Ruby on Rails (Postgres) on Google Container EnginePostgres 问题 - Google Container Engine 上的 Ruby on Rails (Postgres)
【发布时间】:2016-04-03 12:46:19
【问题描述】:

遇到一个小问题,我希望有人能指出我正确的方向。我正在运行 Rails+Postgres 多容器,它们启动良好,但当我尝试访问 LoadBalancer 的 IP 时,rails 在日志中显示:

PG::ConnectionBad (could not connect to server: No such file or directory
Is the server running locally and accepting connections on
Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?):

我的两个容器pod文件和我的database.yml如下:

轨道吊舱

apiVersion: v1
kind: Pod
metadata:
  name: cartelhouse
  labels:
    name: cartelhouse
spec:
  containers:
    - image: gcr.io/xyz/cartelhouse:v6
      name: cartelhouse
      env:
        - name: POSTGRES_PASSWORD
          # Change this - must match postgres.yaml password.
          value: mypassword
        - name: POSTGRES_USER
          value: rails
      ports:
        - containerPort: 80
          name: cartelhouse
      volumeMounts:
          # Name must match the volume name below.
        - name: cartelhouse-persistent-storage
          # Mount path within the container.
          mountPath: /var/www/html
  volumes:
    - name: cartelhouse-persistent-storage
      gcePersistentDisk:
        # This GCE persistent disk must already exist.
        pdName: rails-disk
        fsType: ext4
​
​

POSTGRES 吊舱

apiVersion: v1
kind: Pod
metadata:
  name: postgres
  labels:
    name: postgres
spec:
  containers:
    - name: postgres
      image: postgres
      env:
        - name: POSTGRES_PASSWORD
          value: mypassword
        - name: POSTGRES_USER
          value: rails
        - name: PGDATA
          value: /var/lib/postgresql/data/pgdata
      ports:
        - containerPort: 5432
          name: postgres        
      volumeMounts:
        - name: postgres-persistent-storage
          mountPath: /var/lib/postgresql/data
  volumes:
    - name: postgres-persistent-storage
      gcePersistentDisk:
        # This disk must already exist.
        pdName: postgres-disk
        fsType: ext4
​

DATABASE.YML 文件

​
production:
  <<: *default
  adapter: postgresql
  encoding: unicode
  database: app_production
  username: <%= ENV['PG_ENV_POSTGRES_USER'] %>
  password: <%= ENV['PG_ENV_POSTGRES_PASSWORD'] %>
  host:     <%= ENV['PG_PORT_5432_TCP_ADDR'] %>

我认为这是一个链接问题,还是与我指定的 PGDATA 路径有关?

【问题讨论】:

    标签: ruby-on-rails postgresql docker google-kubernetes-engine


    【解决方案1】:

    您的 Rails pod 似乎已配置为与本地运行的 postgres 实例通信。您需要将其配置为与 postgres pod 或服务的 IP 地址通信。

    【讨论】:

    • 谢谢亚历克斯,您是指将本地 IP 地址硬编码到数据库配置中吗?会试一试,但希望有更多的动态..
    • 不,我的意思是配置您的 Rails 应用程序以使用其 DNS 名称与数据库通信。如果您为 postgres pod 创建服务,那么您可以告诉 Rails 使用 postgres 服务的名称连接到数据库。现在它似乎假设数据库在同一台机器上运行(因此它尝试使用 Unix 域套接字)。
    【解决方案2】:

    感谢@alex-robinson 的指导,他的回答是正确的,尽管原帖的配置还有另一个问题:

    解决方案是使用正确的用户名/密码 ENV 变量修改 database.yml(它们与 OP 中 YAML 设置的 ENV 变量不匹配),并且正如 Alex 提到的那样,使用服务的名称作为主机名。

    production:
      <<: *default
      adapter: postgresql
      encoding: unicode
      database: rails_production
      username: <%= ENV['POSTGRES_USER'] %>
      password: <%= ENV['POSTGRES_PASSWORD'] %>
      host:     postgres
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-26
      • 2019-01-08
      • 1970-01-01
      • 2019-02-04
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 2017-12-05
      相关资源
      最近更新 更多