我有一个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应用程序链接到db
、db: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