Konfiguracja w obrazie dockerowym

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:

konfiguracja w kontenerze z aplikacją

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:

  1. folder /config w folderze aplikacji
  2. w folderze aplikacji
  3. folder /config na classpath
  4. 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 bazowego
  • COPY – skopiowanie pliku do obrazu podczas budowania
  • WORKDIR – zmiana folderu roboczego (z poziomu którego uruchamiana jest aplikacja)
  • EXPOSE – wystawienie portów na zewnątrz kontenera
  • ENTRYPOINT – polecenie uruchamiające aplikację
  • docker build . – zbudowanie obrazu, wynikowo otrzymujemy identyfikator obrazu
  • docker 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