【问题标题】:Socket error from within Rails app in Docker container connecting to remote MySQL DB来自连接到远程 MySQL 数据库的 Docker 容器中 Rails 应用程序中的套接字错误
【发布时间】:2015-06-13 23:33:48
【问题描述】:

我在一个 docker 容器中有一个 rails 应用程序(在生产模式下运行),该容器链接到另一个运行 MySQL 服务器实例的容器。该应用程序本身作为“应用程序”用户在 nginx/passenger 下运行。我在rails下配置了生产数据库如下:

production:
  adapter: mysql
  database: <%= ENV['MYSQL_PRODUCTION_DATABASE'] %>
  pool: 5
  username: <%= ENV['MYSQL_USER'] %>
  password: <%= ENV['MYSQL_PASS'] %>
  host: <%= ENV['MYSQL_HOST'] %>
  port: <%= ENV['MYSQL_PORT'] %>

在容器运行时设置环境变量。当附加到容器(以 root 身份运行)时,我可以成功执行与数据库相关的 rake 命令(迁移、重置等)。但是,当我尝试在浏览器中加载应用程序时,出现以下错误:

Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

activerecord (4.2.0) lib/active_record/connection_adapters/mysql_adapter.rb:456:in `real_connect'
activerecord (4.2.0) lib/active_record/connection_adapters/mysql_adapter.rb:456:in `connect'
activerecord (4.2.0) lib/active_record/connection_adapters/mysql_adapter.rb:108:in `initialize'
activerecord (4.2.0) lib/active_record/connection_adapters/mysql_adapter.rb:36:in `new'
activerecord (4.2.0) lib/active_record/connection_adapters/mysql_adapter.rb:36:in `mysql_connection'

有谁知道什么可能导致 mysql 适配器在这种情况下错误地将连接视为本地连接,但在运行 rake 命令时是远程连接?

【问题讨论】:

  • 请注意,我也尝试过使用具有相同行为的 postgres:一切都在 root 下使用 rake 命令运行,但实际应用程序无法连接到远程服务器。

标签: mysql ruby-on-rails docker


【解决方案1】:

这实际上是由于在运行时设置为参数的环境变量没有在 rails 进程中设置。我的网络服务器(nginx)在运行之前清除了所有环境变量,从而刷新了 docker 设置的那些。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2023-04-03
    • 1970-01-01
    • 2019-04-07
    • 2020-09-05
    • 1970-01-01
    相关资源
    最近更新 更多