[英]Docker: Docker-compose ruby + postgres - PG::ConnectionBadcould not connect to server
我從官方docker -compose 網站創建了 Dockerfile 到 ruby。 我使用 docker compose 將其與 Postgres 集成。 當 docker-compose up 時,PostgreSQL 會啟動,但我無法連接到它。 主要問題在於 ruby 數據庫配置,因為我無法更改為偵聽另一台主機並設置默認用戶。 我不知道如何在不更改 ruby 數據庫配置的情況下連接這兩個容器。
文件
FROM ruby:2.3.4
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
Docker-compose
version: '3'
services:
db:
image: postgres:9.6
ports:
- "5432:5432"
web:
build: .
ports:
- "4000:4000"
depends_on:
- db
Ruby 數據庫.yml
default: &default
adapter: postgresql
encoding: unicode
pool: 5
development:
<<: *default
database: project_development
如果我在 web conatiner "bundle exec rake db:create 中運行,我會收到錯誤:
psql: 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"?
我不知道將連接在一起的環境集。
您沒有在database.yml
指定數據庫主機。 將其設置為db
或只是嘗試這個 database.yml
development: &default
adapter: postgresql
encoding: unicode
database: project_development
pool: 5
username: postgres
password:
host: db
test:
<<: *default
database: project_test
您應該使用以下內容更新 database.yml:
database: ENV['DB_NAME']
username: ENV['DB_USERNAME']
password: ENV['DB_PASSWORD']
沒有“默認 PG 用戶”這樣的東西,因此您必須創建自己的具有適當權限的用戶。
因此,一旦在容器內創建了 PG 用戶,就可以使用適當的數據庫設置更新 docker-compose.yml 文件:
web:
environment:
- DB_NAME=rails_development
- DB_USERNAME=rails_user
- DB_PASSWORD=rails_password
此外,您可能希望在 docker-compose.yml 中掛載 postgres 的本地存儲以在容器重新啟動時保留數據:
volumes:
- /var/lib/postgresql/data
只是為了補充Bartosz Bonisławski 的回答。
我在Ubuntu 18.04 上構建Rails應用程序時遇到了這個問題。
我的development
環境的Dockerfile
位於我項目的docker/development/Dockerfile
目錄中,定義如下:
version: '3'
services:
app:
build:
context: .
dockerfile: ./docker/${RAILS_ENV}/Dockerfile
depends_on:
- database
- redis
ports:
- "3000:3000"
restart: always
volumes:
- .:/app
- gem-cache:/usr/local/bundle/gems
- node-modules:/app/node_modules
env_file:
- .env
environment:
RAILS_ENV: ${RAILS_ENV}
RACK_ENV: ${RACK_ENV}
database:
image: postgres:12.1
expose:
- "5432"
restart: always
env_file:
- .env
environment:
POSTGRES_USER: ${DATABASE_USER}
POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
POSTGRES_DB: ${DATABASE_NAME}
POSTGRES_HOST_AUTH_METHOD: ${DATABASE_HOST}
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
gem-cache:
driver: local
node-modules:
driver: local
postgres-data:
driver: local
雖然我的.env
文件是這樣定義的:
DATABASE_USER=myapp_user
DATABASE_PASSWORD=myapp_password
DATABASE_NAME=myapp_development
DATABASE_HOST=database
DATABASE_PORT=5432
RAILS_ENV=development
RACK_ENV=development
我遇到的問題是我沒有將host
配置添加到我的項目的database.yml
文件中。 所以我遇到了錯誤:
psql:無法連接到服務器:沒有這樣的文件或目錄 服務器是否在本地運行並接受 Unix 域套接字“/var/run/postgresql/.s.PGSQL.5432”上的連接?
這是我解決的方法:
我只是像這樣添加它,它工作得很好:
default: &default
adapter: postgresql
encoding: unicode
# For details on connection pooling, see Rails configuration guide
# https://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
<<: *default
database: <%= ENV['DATABASE_NAME'] %>
username: <%= ENV['DATABASE_USER'] %>
password: <%= ENV['DATABASE_PASSWORD'] %>
host: <%= ENV['DATABASE_HOST'] %>
port: <%= ENV['DATABASE_PORT'] %>
僅此而已。
我希望這有幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.