【问题标题】:Configure Dancer from environment variables?从环境变量配置 Dancer?
【发布时间】:2014-11-05 20:31:49
【问题描述】:

我是 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 配置 Dancer 的好方法?

【问题讨论】:

    标签: perl docker dancer


    【解决方案1】:

    请参阅 Runtime Configuration 文档中的 Runtime Configuration

    如果需要,您可以将 hashref 传递给 database() 关键字以提供配置详细信息,以便在运行时覆盖配置文件中的任何内容,例如:

    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},
        });
    }
    

    【讨论】:

    • 很好的观察,你是对的。但是,如果我按照您的代码建议进行操作,database->quick_select(...) 会产生错误:Can't call method "quick_select" on an undefined。有没有办法保持database 全局?
    • 深入研究 Dancer::Plugin::Database::Core 的代码,看起来您可以通过传递相同的设置 hashref 来在后续调用 database 时获得相同的连接句柄:“用于存储此的密钥%handles 中的句柄。这将是提供给database() 的名称,提供给database() 的哈希引用(因此,只要传递了相同的设置哈希引用,就会重用相同的句柄)或$def_handle如果在没有参数的情况下调用 database()" 不幸的是,传递设置的 hashref 与传递数据库句柄实际上没有什么不同。
    • 您可以尝试将连接设置添加到config 并在那里跟踪它们:Accessing configuration information from your app。或者简单地为 database 函数创建一个包装器,传递正确的设置。
    • @JackM。 database() 返回处理程序 AFAIR,因此您可以将其保存到 var 中,例如 $dbh = database( { driver => ... } )
    【解决方案2】:

    在你的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};
    

    并在 config.yml

    中保留静态配置(驱动程序、端口)

    【讨论】:

      猜你喜欢
      • 2022-08-13
      • 2014-12-17
      • 1970-01-01
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 2015-01-08
      • 1970-01-01
      相关资源
      最近更新 更多