Jednym ze sposobów skonfigurowania mikroserwisu jest zaszycie jego konfiguracji w obrazie dockerowym. Najprostszym sposobem, będzie stworzenie Dockerfile
w którym skopiujemy pliki konfiguracyjne z zewnątrz podczas budowania obrazu. Jednak zdecydowanie lepszym rozwiązaniem będzie użycie mechanizmu warstw i rozdzielenie obrazu z aplikacją w konkretnej wersji od obrazu z konfiguracją.
Rozwiązaniem są warstwy
To co potrzebujemy stworzyć to cebula:
W samym jej środku, mamy jar z aplikacją. Następnie mamy Dockerfile
dla obrazu z aplikacją, który wie jak ją opakować i uruchomić. A na zewnątrz mamy kolejny Dockerfile
, który w odpowiednie miejsce kopiuje konfiguracje. W przypadku kiedy aplikację umieścimy w folderze /app
to konfigurację powinniśmy konfigurację umieścić w folderze /app/config
.
Mogłoby to wyglądać np. tak:
FROM openjdk:11
COPY target/app-2.2.4.jar /app/app.jar
WORKDIR /app
EXPOSE 8080
ENTRYPOINT java -jar app.jar
docker build .
docker tag <image-id> myapp:2.2.4
Następnie tworzymy obraz z zaszytą konfiguracją:
FROM myapp:2.2.4
COPY ./docker-application.yml /app/config/application.yml
docker build -f Dockerfile_ship .
docker tag <image-id> myapp-ship:2.2.4
Mechanizm konfiguracji Spring Boot
Korzystamy tutaj z mechanizmu Spring Boota który wyszukuje konfiguracje w kilku lokalizacjach w określonej kolejności:
- folder
/config
w folderze aplikacji - w folderze aplikacji
- folder
/config
naclasspath
- na
classpath
Wpisy konfiguracyjne wcześniej wczytane otrzymują wyższy priorytet i nie są nadpisywane wpisami z innych lokalizacji. Dzięki temu mechanizmowi możemy rozdzielić domyślne ustawienia aplikacji, które na przykład umieścimy na classpath, czyli w pliku resources/application.yml
który to znajdzie się w skompilowanym jarze za aplikacją. Oraz na ustawienia związane ze środowiskiem w którym uruchamiamy aplikację. Właśnie te ustawienia możemy umieścić w obrazie na oddzielnej warstwie.
Idąc dalej możemy użyć tego mechanizmu do stworzenia kilku wersji aplikacji w postaci gotowych obrazów dockerowych. Każdy z nich ma zaszytą zupełnie inną konfigurację i np. włączone zupełnie inne zestawy ficzerów.
Więcej informacji o mechanizmie konfiguracji Spring Boot, można znaleźć w dokumentacji.
Objaśnienie operacji na Dockerfile
FROM
– określenie obrazu bazowegoCOPY
– skopiowanie pliku do obrazu podczas budowaniaWORKDIR
– zmiana folderu roboczego (z poziomu którego uruchamiana jest aplikacja)EXPOSE
– wystawienie portów na zewnątrz konteneraENTRYPOINT
– polecenie uruchamiające aplikacjędocker build .
– zbudowanie obrazu, wynikowo otrzymujemy identyfikator obrazudocker tag <id-obrazu> <tag>
– nadanie tagu obrazowi, dzięki czemu możemu go łatwo użyć jako obraz bazowy, inaczej musielibyśmy się posłużyć identyfikatorem
Pełny opis Dockerfile
dostępny jest w dokumentacji.
Artykuły na temat konfiguracji
- Konfiguracja w Kontenerze – wykorzystanie warstw Dockerowych do przechowywania konfiguracji
- Konfiguracja ze zmiennych środowiskowych – wykorzystanie zmiennych środowiskowych do wstrzykiwania parametrów do konfiguracji
- Konfiguracja z serwera konfiguracji – wykorzystanie Spring Cloud Config w celu utworzenia serwera konfiguracji
- 4 sposoby na organizację konfiguracji w repozytorium – porównanie kilku strategii organizacji konfiguracji w repozytorium GIT