未知 MySQL 服务器主机 'db' Rails 和 Docker
Unknown MySQL server host 'db' Rails and Docker
这很奇怪。我目前正在使用 Rails 5.1.5 与 Docker 和 Docker-Compose。我正在连接到一个远程 MySQL(它有防火墙,访问权限有限。不,数据库 而不是 在 docker 容器内;它 运行s 在它自己的服务器中)。我能够 运行 rails db:migrate
并且架构 已成功创建 。
但是,当我尝试导航到具有数据库调用的网站部分时,它显示:
We're sorry, but something went wrong.
我继续并启用 STOUT 日志来检查发生的一切。好像有一部分是这样写的:
Mysql2::Error (Unknown MySQL server host 'db'. (-2));
请注意,'db' 是我的 开发 环境的主机。生产环境是另一个。
我不认为这是一个 Docker 问题(尽管我可能是错的)
这是当前的 database.yml:
default: &default
adapter: mysql2
pool: 5
encoding: utf8
database: <%= Rails.application.secrets.mysql_database %>
username: <%= Rails.application.secrets.mysql_username %>
password: <%= Rails.application.secrets.mysql_password %>
host: <%= Rails.application.secrets.mysql_host %>
port: 3306
development: *default
test:
<<: *default
database: db/test.sqlite3
production: *default
当前secrets.yml如下:
development:
secret_key_base: the_secret_key_base
mysql_database: <%= ENV["SECRET_MYSQL_DATABASE"] %>
mysql_username: <%= ENV["SECRET_MYSQL_USERNAME"] %>
mysql_password: <%= ENV["SECRET_MYSQL_PASSWORD"] %>
mysql_host: <%= ENV['SECRET_MYSQL_HOST'] %>
我目前正在使用
config.read_encrypted_secrets = true
而加密后的secrets.yml.enc为:
这是我目前使用的 Docker-Compose 文件:
version: '3.2'
services:
app:
image: jja3324/ntid:cprintservicehub_app
restart: always
environment:
RAILS_ENV: production
# What this is going to do is that all the logging is going to be printed into the console.
# Use this with caution as it can become very verbose and hard to read.
# This can then be read by using docker-compose logs app.
RAILS_LOG_TO_STDOUT: 'true'
# The first command, the remove part, what it does is that it eliminates a file that
# tells rails and puma that an instance is running. This was causing issues,
# https://github.com/docker/compose/issues/1393
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -e production -p 5000 -b '0.0.0.0'"
volumes:
- /var/www/cprint
ports:
- "5000:5000"
expose:
- "5000"
# Uses Nginx as a web server (Access everything through http://localhost)
#
web:
image: jja3324/ntid:cprintservicehub_web
restart: always
links:
- app
volumes:
- type: bind
source: /path-to/ssl/certs
target: /path-to/ssl/certs
- type: bind
source: /path-to-private-ssl/private/
target: /path-to-private-ssl/private
links:
- app
ports:
- "80:80"
- "443:443"
阅读 this answer 告诉我 Rails 无法解析 MySQL 服务器的名称。我认为这意味着 Rails 默认回到其原始配置。
有什么想法吗?谢谢:)
虽然我还没有完全解决问题(还不能连接到数据库),但似乎这与 Nginx 有关,config.force_ssl
在 production.rb
显然,我在 Nginx 配置中遇到了错误。 I was missing 在配置文件中设置X-Forwarded-Proto https
header。这导致了无限重定向(老实说,我不知道为什么它们在前一天不存在……我认为这是因为我浏览器中的 cookie)。
完成后,Rails 正确使用了我的配置。我仍然需要找出问题所在(这似乎是防火墙问题)。
这很奇怪。我目前正在使用 Rails 5.1.5 与 Docker 和 Docker-Compose。我正在连接到一个远程 MySQL(它有防火墙,访问权限有限。不,数据库 而不是 在 docker 容器内;它 运行s 在它自己的服务器中)。我能够 运行 rails db:migrate
并且架构 已成功创建 。
但是,当我尝试导航到具有数据库调用的网站部分时,它显示:
We're sorry, but something went wrong.
我继续并启用 STOUT 日志来检查发生的一切。好像有一部分是这样写的:
Mysql2::Error (Unknown MySQL server host 'db'. (-2));
请注意,'db' 是我的 开发 环境的主机。生产环境是另一个。
我不认为这是一个 Docker 问题(尽管我可能是错的)
这是当前的 database.yml:
default: &default
adapter: mysql2
pool: 5
encoding: utf8
database: <%= Rails.application.secrets.mysql_database %>
username: <%= Rails.application.secrets.mysql_username %>
password: <%= Rails.application.secrets.mysql_password %>
host: <%= Rails.application.secrets.mysql_host %>
port: 3306
development: *default
test:
<<: *default
database: db/test.sqlite3
production: *default
当前secrets.yml如下:
development:
secret_key_base: the_secret_key_base
mysql_database: <%= ENV["SECRET_MYSQL_DATABASE"] %>
mysql_username: <%= ENV["SECRET_MYSQL_USERNAME"] %>
mysql_password: <%= ENV["SECRET_MYSQL_PASSWORD"] %>
mysql_host: <%= ENV['SECRET_MYSQL_HOST'] %>
我目前正在使用
config.read_encrypted_secrets = true
而加密后的secrets.yml.enc为:
这是我目前使用的 Docker-Compose 文件:
version: '3.2'
services:
app:
image: jja3324/ntid:cprintservicehub_app
restart: always
environment:
RAILS_ENV: production
# What this is going to do is that all the logging is going to be printed into the console.
# Use this with caution as it can become very verbose and hard to read.
# This can then be read by using docker-compose logs app.
RAILS_LOG_TO_STDOUT: 'true'
# The first command, the remove part, what it does is that it eliminates a file that
# tells rails and puma that an instance is running. This was causing issues,
# https://github.com/docker/compose/issues/1393
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -e production -p 5000 -b '0.0.0.0'"
volumes:
- /var/www/cprint
ports:
- "5000:5000"
expose:
- "5000"
# Uses Nginx as a web server (Access everything through http://localhost)
#
web:
image: jja3324/ntid:cprintservicehub_web
restart: always
links:
- app
volumes:
- type: bind
source: /path-to/ssl/certs
target: /path-to/ssl/certs
- type: bind
source: /path-to-private-ssl/private/
target: /path-to-private-ssl/private
links:
- app
ports:
- "80:80"
- "443:443"
阅读 this answer 告诉我 Rails 无法解析 MySQL 服务器的名称。我认为这意味着 Rails 默认回到其原始配置。
有什么想法吗?谢谢:)
虽然我还没有完全解决问题(还不能连接到数据库),但似乎这与 Nginx 有关,config.force_ssl
在 production.rb
显然,我在 Nginx 配置中遇到了错误。 I was missing 在配置文件中设置X-Forwarded-Proto https
header。这导致了无限重定向(老实说,我不知道为什么它们在前一天不存在……我认为这是因为我浏览器中的 cookie)。
完成后,Rails 正确使用了我的配置。我仍然需要找出问题所在(这似乎是防火墙问题)。