Czytałem ostatnio debatę na temat „ Gdzie powinny być przechowywane nieruchomości zależne od środowiska? ”.
Klasycznym sposobem jest posiadanie wielu plików właściwości, po jednym dla środowiska i na podstawie zmiennej środowiskowej (DEV, PROD ...), wybierasz, gdzie je odczytać przy uruchamianiu aplikacji (jak w przypadku profili Spring).
Z drugiej strony, jeśli używasz kontenera do wdrożenia aplikacji, mówi się, że tego rodzaju konfiguracja powinna pochodzić z samego środowiska (przy użyciu zmiennych środowiskowych odczytywanych przez aplikację), więc obraz nie zmienia się między środowiskami.
Jakie są zalety i wady każdego podejścia? Czy istnieje „najlepsze” podejście do scenariusza dotyczącego kontenera?
docker
containers
configuration
Carcaret
źródło
źródło
Odpowiedzi:
Kto powiedział, że pliki właściwości i zmienne środowiskowe wykluczają się wzajemnie?
Należy rozróżnić „gdzie mam zapisać konfigurację mojej aplikacji?” I „gdzie moja aplikacja źródło to konfiguracja?”
Najbardziej prawdopodobnym rezultatem jest to, że wszyscy prawdopodobnie powinni po prostu robić to, co robią z plikami konfiguracyjnymi jako mechanizmem przechowywania (pomyśl długoterminowo, stan trwały, dopóki istnieje środowisko).
Jednak zamiast upuszczać ten plik konfiguracyjny do kontekstu aplikacji i pozwalać na jego uruchomienie, aplikacja powinna oczekiwać, że te zmienne będą już dostępne w środowisku podczas uruchamiania.
Oznacza to, że musisz mieć dwa przepływy pracy wdrażania -
Aby użyć przykładu zarządzania zmiennymi środowiskowymi jako parami wartości klucza w narzędziu takim jak konsul, jeśli przechowujesz pliki konfiguracyjne w git, to narzędzia takie jak git2consul z uchwytem pobierają tę konfigurację do środowiska, gdy jest aktualizowana.
Jeśli masz aplikację, która spodziewa się, że będzie dostępna konfiguracja jako plik konfiguracyjny, możesz uniknąć wysyłania wielu kopii pliku konfiguracyjnego z aplikacją, budując proces wdrażania z czymś takim jak konsul-szablon, który ma możliwość zmiany twojego konsul wartości z powrotem do pliku.
źródło
W ten sposób mamy 3 elementy (lub artefakty) dla każdej uruchomionej aplikacji.
Plik konfiguracyjny znajduje się w osobnej kontroli źródła. Kiedyś był to Git, ale teraz korzystamy z SaaS, który zbudowaliśmy o nazwie Config, pod adresem http://www.configapp.com . Podstawową funkcją Config jest łatwa obsługa konfiguracji specyficznej dla środowiska. Aby uruchomić naszą aplikację na nowym serwerze, pobieramy kontener Docker, artefakt aplikacji i plik konfiguracyjny dla tego środowiska. W kontenerze montujemy katalog, w którym przechowywana jest aplikacja i plik konfiguracyjny, w ramach działania kontenera. Nasza aplikacja jest taka sama. Nasz pojemnik / obraz jest taki sam. Tylko plik konfiguracyjny jest inny.
Jeśli chodzi o plik konfiguracyjny a zmienne środowiskowe. Najdłużej korzystaliśmy z plików konfiguracyjnych. Kiedy korzystaliśmy z PaaS / cloud, używaliśmy zmiennych środowiskowych. To była dodatkowa praca, jeśli masz dużo konfiguracji, więc do określenia poprawnego pliku konfiguracyjnego wykorzystaliśmy zmienne środowiskowe. Mamy jedną aplikację, która przekształciła właściwości w zmienne środowiskowe, ale to nietypowe. Jeśli mamy sankcjonowany przez firmę scentralizowany serwer konfiguracji, korzystamy z niego, w przeciwnym razie lubimy prostotę plików konfiguracyjnych.
Podsumowując, pobieramy app.jar, app.properties, openjdk Docker. Następnie uruchamiamy Docker openjdk, instalując lokalizację app.jar i app.properties. Jedyne, co jest specyficzne dla środowiska, to app.properties. Aby łatwo zarządzać app.properties, niezależnie od liczby kluczy właściwości, środowisk, wystąpień klastra / regionu, używamy Config.
źródło