2014-11-05 11 views
6

Jestem nowy dla Dancer, ale próbuję skonfigurować go do pracy w kontenerze Docker. W rezultacie muszę pobrać moje ustawienia bazy danych ze środowiska.Skonfiguruj Dancer ze zmiennych środowiskowych?

W moim przypadku mam DB_PORT_3306_TCP_ADDR i DB_PORT_3306_TCP_PORT pochodzących z Docker. Niestety, moduł Dancer::Plugin::Database jest błędny, zanim mogę zmienić bazę danych, aby używać tych zmiennych.

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

Pytanie brzmi, czy istnieje dobry sposób na skonfigurowanie Dancer ze zmiennych środowiskowych zamiast przez statyczny YAML?

Odpowiedz

5

Zobacz Runtime Configuration w 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 });

Ty dodanie ->, co powoduje błąd. Poniższy powinno działać:

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

Wielka obserwacja, i masz rację. Jednakże, jeśli zrobię tak, jak sugeruje twój kod, 'database-> quick_select (...)' '' '' '' not can be call method "quick_select" na undefined'. Czy nie ma sposobu na utrzymanie "bazy danych" globalnej? –

+0

Kopiowanie kodu 'Dancer :: Plugin :: Database :: Core', wygląda na to, że możesz uzyskać ten sam uchwyt połączenia podczas kolejnych wywołań do' bazy danych ', przekazując ten sam skrót ustawień: "Klucz do użycia do przechowaj ten uchwyt w '% handles' .To będzie nazwa podana do' database() ', hashref dostarczone do' database() '(tak długo jak ten sam hashref jest przekazywany, ten sam uchwyt będzie być ponownie użyty) lub '$ def_handle', jeśli' database() 'jest wywoływana bez argumentów" Niestety, omijanie hashref ustawień tak naprawdę nie różni się od przekazywania uchwytu bazy danych. – ThisSuitIsBlackNot

+0

Możesz bawić się dodając ustawienia połączenia do 'config' i śledząc je tam: [Dostęp do informacji konfiguracyjnych z twojej aplikacji] (https://metacpan.org/pod/Dancer::Cookbook#Accessing-configuration-information -z-twojej-aplikacji). Lub po prostu tworzenie wrappera dla funkcji 'database', która przechodzi we właściwych ustawieniach. – ThisSuitIsBlackNot

0

Na początku swojej lib/myapp.pm po ładowaniem modułów, dodać:

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

i zachować statyczną config (kierowcy, port) w config .yml

Powiązane problemy