我在一个docker容器中有一个rails应用程序(在生产模式下运行)链接到另一个运行MySQL服务器实例的容器。该应用程序本身作为“app”用户在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命令时是远程的?
答案 0 :(得分:0)
这实际上是由在运行时设置为参数的环境变量未在rails进程中设置引起的。我的Web服务器(nginx)在运行之前清除所有环境变量,从而刷新docker设置的那些。