如何使用Rails连接到PostgreSQL容器



我有一个Docker文件,它用nginx和PostgreSQL数据库声明我的Ruby on Rails应用程序。

我很难理解Rails应用程序是如何连接到PostgreSQL容器的,因为它根本不连接。

我构建了链接图像的Docker文件:

web:
build: .
command: bundle exec puma -C config/puma.rb
volumes:
- /tmp:/tmp
# - /log:/data
- .:/my_project_folder
links:
- nginx
- db
nginx:
build: ./nginx
volumes:
- /tmp:/tmp
ports:
- 80:80
db:
image: postgres
environment:
POSTGRES_PASSWORD: "Postgres2019!"
ports:
- "15432:5432"
volumes:
- /Users/fred/Documents/Postgres/data:/var/lib/postgresql/data

并配置了我的数据库。yml like:

default: &default
adapter: postgresql
encoding: unicode
host: 0.0.0.0
port: 15432
# For details on connection pooling, see Rails configuration guide
# https://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: postgres
password: Postgres2019!
development:
<<: *default
database: mos_development

但是每当我尝试运行我的应用程序时,Rails都无法连接到返回的数据库

ActiveRecord::ConnectionTimeoutError

但当我检查我的集装箱时,一切都很好:

CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                     NAMES
1cfbc010829a        project_web           "bundle exec puma -C…"   19 minutes ago      Up 13 minutes                                 project_web_1
1774e2b89452        postgres              "docker-entrypoint.s…"   20 minutes ago      Up 13 minutes       0.0.0.0:15432->5432/tcp   project_db_1
0ce7dbb6d735        project_nginx         "nginx -g 'daemon of…"   3 hours ago         Up 13 minutes       0.0.0.0:80->80/tcp        project_nginx_1

如果我的PostgreSQL容器在0.0.0.0:15432上运行,那么我的Rails容器也应该能够在0.0.0.0:15432上连接到它,对吧?

试试这个:

default: &default
adapter: postgresql
encoding: unicode
host: db    # <-- change this line
port: 15432
# For details on connection pooling, see Rails configuration guide
# https://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: postgres
password: Postgres2019!
development:
<<: *default
database: mos_development

Rails应用程序链接到dbdb:15432

这通常是Active Record配置的问题,而不是数据库本身的问题。

您可以通过从命令行运行heroku pg:info并查看连接数与计划的最大连接数的比较来验证数据库是否具有可用连接。

此错误通常是由于活动记录池大小设置得过低,或者试图在大量工作进程之间共享少量数据库连接而导致的。

你可以玩这个:

pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 1 } %>

就这部分问题而言:

如果我的postgres容器在0.0.0.0:15432运行,那么我的rails容器也应该在0.0.0.0:125432连接到它,对吗?

是的,您必须使用:

docker-host-ip:15432 

如果环境变量太多,可以在env文件中设置它们。例如

# .env.docker
RAILS_MAX_THREADS=4
USERNAME=posgres
...
...

然后通过env_file:在docker撰写文件中指定.env.docker文件

db:
image: postgres
env_file: .env.docker
environment:
POSTGRES_PASSWORD: "Postgres2019!"
ports:
- "15432:5432"
volumes:
- /Users/fred/Documents/Postgres/data:/var/lib/postgresql/data
...
...

我也遇到了同样的问题。试试这个

default: &default
adapter: postgresql
encoding: unicode
host: db # change this line
port: 5432 # change this line too, use internal port
# For details on connection pooling, see Rails configuration guide
# https://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: postgres
password: Postgres2019!
development:
<<: *default
database: mos_development

最新更新