Docker część VIII: wielokrotne FROM

Dzisiaj będzie krótko. W jednym z wpisów o dockerze opowiadałem o plikach Dockerfile. Pokazałem wtedy, jak można za pomocą takiego pliku zbudować aplikację podczas tworzenia obrazu. Dziś chciałbym zademonstrować, jak za pomocą wielokrotnych FROM możemy zbudować nasz projekt w jednym obrazie oraz wystawić go w innym.

Jako przykład posłuży nam prosta aplikacja MVC o nazwie Sample. Jej struktura przedstawia się tak:
Screen Shot 2018-07-08 at 22.21.24
Kilka słów wyjaśnienia:
-src – folder, w którym znajduje się kod produkcyjny naszej aplikacji
-tests – folder z testami
-artifacts – folder, w którym publikujemy nasz release
-build – folder ze skryptami budującymi
-packages – folder z pobranymi paczkami
Nasz plik Dockefile przedstawia się następująco:

FROM microsoft/dotnet:2.0-sdk as builder

COPY . /source/

WORKDIR /source/src/Sample

RUN dotnet publish -o ../../artifacts

FROM microsoft/aspnetcore:2.0.0

COPY --from=builder /source/artifacts/. app/

ENV ASPNETCORE_URLS="http://+:5000"
ENV ASPNETCORE_ENVIRONMENT production

WORKDIR app

ENTRYPOINT dotnet Sample.dll

Jak widzimy, znajdują się w nim 2 instrukcje FROM, jednak pierwsza oznaczona jest jako builder. O co chodzi? Obraz oznaczony jako builder ma bardzo proste zadanie: wystawić publish naszej aplikacji. W tym przypadku ograniczyłem się po prostu do skopiowania wszystkiego, co mam w moim projekcie na obraz oraz uruchomienie komendy dotnet publish w odpowiednim folderze. Następnie uruchamiamy drugi, właściwy obraz, na który kopiujemy pliki z buildera. Co nam to daje? Dzięki temu możemy robić publish naszej aplikacji zawsze w takich samych warunkach. Możemy również stworzyć specjalnie przygotowany pod taki publish obraz, na którym, dla przykładu, mamy zdefiniowane jakieś zmienne środowiskowe, które są zależne od środowiska. Mechanizm jest bardzo prosty, a możliwości jest tutaj bez liku!

Istnieją jednak 2 problemy: po pierwsze, mechanizm kilku FROM jest dostępny dopiero od wersji 17.05. Po drugie, wynikiem komendy

docker build .

będą 2 obrazy – buidler oraz docelowy. Można sobie z tym poradzić na kilka sposobów, ja w domowych warunkach używam po prostu komendy

docker images prune

Jednak należy z nią uważać, ponieważ usuwa ona wszystkie nieotagowane obrazy, przez co bardzo łatwo usunąć coś, co nam się jeszcze przyda!

To w zasadzie tyle. Tak jak wspominałem, wpis jest krótki, zachęcam do zgłębiania możliwości wykorzystywania kilku FROM oraz do podzielenia się swoimi metodami na pozbycie się builderów

No następnego razu!

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s