Postgres 问题 - Ruby on Rails (Postgres) on Google Container Engine
Postgres issue - Ruby on Rails (Postgres) on Google Container Engine
运行 遇到一个小问题,我希望有人能指出正确的方向。我 运行 一个 Rails+Postgres 多容器,它们启动正常,除了 rails 在我尝试访问 LoadBalancer 的 IP 时在日志中显示:
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如下:
RAILS POD
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 POD
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 路径有关?
您的 Rails pod 看起来配置为与本地的 postgres 实例 运行 对话。您需要将其配置为与 postgres pod 或服务的 IP 地址通信。
感谢@alex-robinson 的指导,他的回答是正确的,尽管原始 post 的配置还有另一个问题:
解决方案是用 username/password 的正确 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
运行 遇到一个小问题,我希望有人能指出正确的方向。我 运行 一个 Rails+Postgres 多容器,它们启动正常,除了 rails 在我尝试访问 LoadBalancer 的 IP 时在日志中显示:
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如下:
RAILS POD
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 POD
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 路径有关?
您的 Rails pod 看起来配置为与本地的 postgres 实例 运行 对话。您需要将其配置为与 postgres pod 或服务的 IP 地址通信。
感谢@alex-robinson 的指导,他的回答是正确的,尽管原始 post 的配置还有另一个问题:
解决方案是用 username/password 的正确 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