2014-11-05 15 views
6

Sono nuovo a Dancer, ma sto cercando di configurarlo per funzionare all'interno di un contenitore Docker. Di conseguenza, ho bisogno di prendere le mie impostazioni del database dall'ambiente.Configura Dancer dalle variabili di ambiente?

Nel mio caso, ho DB_PORT_3306_TCP_ADDR e DB_PORT_3306_TCP_PORT provenienti da Docker. Sfortunatamente, il modulo Dancer::Plugin::Database sta commettendo errori prima che possa cambiare il database per usare quelle variabili.

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

Quindi la domanda è: esiste un buon modo per configurare Dancer dalle variabili d'ambiente, invece che attraverso YAML statica?

risposta

5

Vedi Runtime Configuration nelle Dancer::Plugin::Database docs:

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

Stai salvando un ->, che causa un errore. Il seguente dovrebbe funzionare:

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

Grande osservazione e hai ragione. Tuttavia, se faccio come suggerisce il tuo codice, 'database-> quick_select (...)' produce un errore: 'Impossibile chiamare il metodo" quick_select "su un indefinito'. Non c'è un modo per mantenere il 'database' globale? –

+0

Scavando nel codice per 'Dancer :: Plugin :: Database :: Core', sembra che si possa ottenere lo stesso handle di connessione nelle successive chiamate a' database' passando lo stesso hashref delle impostazioni: "La chiave da usare per memorizza questo handle in '% handles'. Questo sarà il nome fornito a' database() ', l'hashref fornito a' database() '(così, finché lo stesso hashref delle impostazioni è passato, lo stesso handle sarà essere riutilizzato) o '$ def_handle' se' database() 'viene chiamato senza argomenti" Sfortunatamente, passare attorno a un hashref di impostazioni non è in realtà diverso dal passare attorno a un handle di database. – ThisSuitIsBlackNot

+0

È possibile giocare con l'aggiunta delle impostazioni di connessione a 'config' e tenerne traccia lì: [Accesso alle informazioni di configurazione dall'app] (https://metacpan.org/pod/Dancer::Cookbook#Accessing-configuration-information -da-your-app). O semplicemente creando un wrapper per la funzione 'database' che passa nelle impostazioni corrette. – ThisSuitIsBlackNot

0

All'inizio del tuo lib/myapp.pm, dopo caricamento del modulo, aggiungere:

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

e mantenere configurazione statica (driver, porto) in config .yml

Problemi correlati