Przy tworzeniu własnej aplikacji bardzo często będziemy musieli tworzyć obrazy Dockera dla nich. Ale nie patrz na gotowe repozytoria jak to zrobić. Ja ci pokaże, jak można zbudować swój pierwszy obraz w 10 minut.
Dockerfile
Przy budowaniu obrazów Dockera najważniejszy jest tajemniczy plik Dockerfile. Zawiera on instrukcje, krok po kroku, jak będzie budowany obraz. Najprościej będzie to porównać do własnoręcznego stawiania serwera - instalujemy poszczególne elementy, konfigurujemy je, uruchamiamy i .... wracamy do początku ;). Na szczęście przy Dockerze szansa, iż coś zepsujemy, jest naprawdę mała. Jak wygląda struktura takiego pliku? Wspólny element to będzie pobranie bazowego obrazu (FROM) i uruchomienie dowolnej komendy na nim (CMD lub ENTRYPOINT). Pomiędzy tymi dwoma elementami może być dużo innych elementów.
Czym jest bazowy obraz?
To, iż w Dockerze budujemy nasze obrazy, nie znaczy, iż zawsze musimy startować od 0. Bazowy obraz to jest punkt startowy, od którego zaczynamy instalować kolejne biblioteki. Przykładem takiego obrazu startowego może być ubuntu, alpine(bardzo lekka dystrybucja Linuxa) czy dowolna inna dystrybucja Linux'a. Ale może to już być choćby obraz z Node'a gdzie oprócz czystego Linux'a jest zainstalowana i skonfigurowana konkretna wersja Node'a. W takim przypadku nie musimy już nic instalować dodatkowo tylko skopiować pliki i ruszyć naszą aplikację. No i oczywiście to może być jakiś twój poprzedni obraz, który teraz rozbudujesz.
Twój pierwszy obraz
No to zbudujmy pierwszy obraz. Tak jak wspomniałem, potrzebny jest plik Dockerfile. Następnie w tym pliku umieścimy taką zawartość.
Co tu się dzieje? Bazujemy na obrazie alpine i wykorzystując polecenie echo, wyświetlamy Hello World. Po tym wszystkim działanie kontenera się zakończy.
Teraz musimy na podstawie powyższej konfiguracji zbudować gotowy obraz. Służy do tego polecenie docker build
Polecenie buduje obraz, któremu nadajemy nazwę i tag (przełącznik -t w formacie nazwa:tag). Na samym końcu musimy podać ścieżkę do pliku Dockerfile (jeśli plik znajduje się w tym samym katalogu, to wystarczy dać . tak jak w przykładzie)
Jeśli wszystko zostało zrobione poprawnie, to po uruchomieniu polecenia docker images powinniśmy zobaczyć nasz obraz. To jak uruchomić obraz wiesz po poprzednim poście (a jeżeli nie to wróć do postu o podstawach dockera)
CMD vs ENTRYPOINT
Na sam koniec coś bardziej zaawansowanego - różnica pomiędzy CMD a ENTRYPOINT. Obydwa wywołają polecenie w naszym kontenerze, ale diabeł tkwi w szczegółach.
Polecenie CMD da się nadpisać podczas uruchamiania obrazu
Zrób szybki eksperyment - uruchomcie poprzednio zbudowany obraz takim poleceniem
Teraz jak widać w naszym kontenerze, nie jest wywoływane polecenie echo tylko ls. ENTRYPOINT działa inaczej.
ENTRYPOINT nie da się nadpisać podczas uruchamiania (bez dodatkowych przełączników)
Można nadpisać przełącznikiem --entrypoint ale jest to przypadek szczególny. Znowu zrób eksperyment - zbuduj obraz tylko zastąp linijkę z CMD ["echo", "Hello World"] linijką ENTRYPOINT ["echo", "Hello World"] i uruchom poniższe polecenie.
Teraz jak widzisz, nie nadpisaliśmy polecenia, ale dopisaliśmy jako kolejny argument do już zdefiniowanego.
Najlepsze efekty możemy osiągnąć, wykorzystując oba polecenia. Zbuduj następujący obraz.
I uruchom dwa polecenia.
Zobaczysz coś takiego
Jak widać, teraz CMD definiuje nam domyślne argumenty, kiedy odpalimy obraz bez żadnych parametrów. W momencie, kiedy przekażemy własny parametr, to parametr z CMD zostanie zignorowany.
Zadanie domowe
Zadanie domowe na dzisiaj jest proste. Zbuduj swój pierwszy obraz i pobaw się poleceniami CMD i ENTRYPOINT. Zobacz sobie, jak to działa i zapamiętaj różnicę pomiędzy CMD a ENTRYPOINT (jest to też popularne pytanie na rekrutacji). Jako zadanie napisz obraz, który wyświetli ci listę katalogów z lokalizacji podanej podczas uruchamiania. jeżeli nic nie zostało przekazane, niech pokazuje główny katalog (/).