2014-11-05 98 views
6

我是Dancer的新手,但我试图将其配置为在Docker容器中工作。因此,我需要从环境中获取数据库设置。从环境变量配置舞者?

在我的情况下,我有来自Docker的DB_PORT_3306_TCP_ADDRDB_PORT_3306_TCP_PORT。不幸的是,Dancer::Plugin::Database模块在我更改数据库以使用这些变量之前出错。

use Dancer ':syntax'; 
use Dancer::Plugin::Database; 

if ($ENV{DB_PORT_3306_TCP}) {## Connected via docker. 
    database->({ 
     driver => 'mysql', 
     username => 'username', 
     password => 'password', 
     host => $ENV{DB_PORT_3306_TCP_ADDR}, 
     port => $ENV{DB_PORT_3306_TCP_PORT}, 
     database => $ENV{DB_ENV_MYSQL_DATABASE}, 
    }); 
} 

所以问题是,有没有一种很好的方式来配置舞者从环境变量,而不是通过静态YAML?

回答

5

Runtime ConfigurationDancer::Plugin::Database文档:

You can pass a hashref to the database() keyword to provide configuration details to override any in the config file at runtime if desired, for instance:

my $dbh = database({ driver => 'SQLite', database => $filename });

你加入->,这会导致错误。下面应该工作:

use Dancer ':syntax'; 
use Dancer::Plugin::Database; 

if ($ENV{DB_PORT_3306_TCP}) {## Connected via docker. 
    database({ 
     driver => 'mysql', 
     username => 'username', 
     password => 'password', 
     host => $ENV{DB_PORT_3306_TCP_ADDR}, 
     port => $ENV{DB_PORT_3306_TCP_PORT}, 
     database => $ENV{DB_ENV_MYSQL_DATABASE}, 
    }); 
} 
+0

伟大的观察,你是对的。然而,如果我按照你的代码所建议的那样,'database-> quick_select(...)'会产生一个错误:'Can not call method'quick_select“on undefined'。有没有办法保持'数据库'全球? – 2014-11-05 22:27:34

+0

挖掘到'Dancer :: Plugin :: Database :: Core'的代码,它看起来像你可以通过传递相同的hashref设置,在随后调用'database'时获得相同的连接句柄:“要使用的键将这个句柄存储在'%handles'中,这将是提供给'database()'的名字,提供给'database()'的hashref(因此,只要传递相同的hashref设置,相同的句柄就会被重用)或者'$ def_handle'如果没有参数调用database()不幸的是,传递设置的hashref实际上和传递数据库句柄没有什么不同。 – ThisSuitIsBlackNot 2014-11-05 23:06:04

+0

你可能会尝试将连接设置添加到“config”并在其中跟踪它们:[从您的应用程序访问配置信息](https://metacpan.org/pod/Dancer::Cookbook#Accessing-configuration-information - 从 - 您的应用程序内)。或者简单地为传递正确设置的'database'函数创建一个包装器。 – ThisSuitIsBlackNot 2014-11-05 23:14:35

0

在你的lib/myapp.pm的开始,模块加载后,放入:

setting('plugins')->{'Database'}->{'host'}='postgres'; 
setting('plugins')->{'Database'}->{'database'}=$ENV{POSTGRES_DB}; 
setting('plugins')->{'Database'}->{'username'}=$ENV{POSTGRES_USER}; 
setting('plugins')->{'Database'}->{'password'}=$ENV{POSTGRES_PASSWORD}; 

,并保持静态配置(驱动程序,端口)在配置.yml