sobota, kwietnia 01, 2023

Docker image to taka kanapka ;-)

Jakiś rok temu miałem przed sobą problem jak kopiować obrazy Dockerowe miedzy różnymi registry.

Problem w końcu rozwiązaliśmy inaczej, i bardziej sensownie ;-) przez proste pozwolenie tak PROD jak i DEV na korzystanie z tego samego ECRa ;-) ale wcześniej było kilka pomysłów.

Oryginalnie były sobie skrypty, które logowały się do jednego registry, robiły pull obrazu, później logowały się do drugiego registry i robiły push.

Był więc pomysł by to zrobić z Java'y przez wołanie dockera.... niby powinno działać, ale obraz Dockerem to jest rzecz trudna ;-)

W końcu skończyłem na napisaniu swojego "klienta" Dockera.

(przy okazji mam wrażenie, że już o tym pisałem, ale trudno ;-))

Co mnie zachwyciło to to, że dzięki tym zabawą z tym klientem dla registry zrozumiałem parę spraw, np. to czemu nie można wygenerować zbytnio Docker image na podstawie obrazu ;-) i co to jest w ogóle obraz ;-)

Zaczynając od początku, moje rozumowanie było takie, Docker jakoś pobiera te obrazy i jakoś je pushuje... robi to najpewniej po HTTP, więc wystarczy go udać ;-)

No i okazało się, że obraz to tak naprawdę nie jedna binarka a plik manifestu, który składa się z warstw.

Registry można poprosić o manifest, w manifeście są informacje o obrazie takie jak nazwa, tag, podpis, zmienne środowiskowe i co najważniejsze informacje o warstwach.

Stąd pull polega na tym, że najpierw pobiera się manifest, na podstawie danych o warstwach w manifeście pobiera się poszczególne warstwy... i tu czasem wystarczy po prostu nie pobierać warstwy, bo przecież już ją możemy mieć w innym obrazie :-)

Push to znów najpierw POST z info, że chcemy zrobić upload leyara (tak zaczynamy z layerem :-)) i dostajemy zwrotkę z nagłówkiem Location w którym jest info gdzie mamy pchać layera. Wtedy robimy tam PUT i musimy dodać digest do naszego bloba i pchamy tego bloba pod ten adres (który jest zbudowany z tego co w POST dostaliśmy.

Jak już wrzucimy warstwy to robimy PUT manifestu :-) (w nim są też tagi które chcemy obrazowi nadać).

Teraz kopiowanie Docker imange'ów między repozytoriami to pobranie z jednego manifestu, próba pobrania z drugiego tych manifestów i dla tych, których nie ma na serwerze docelowym trzeba ze źródłowego pobrać warstwę, i wysłać ją do docelowego. 
W końcu robimy push docker image'a.

Trochę mi brakuje takich zabaw programistycznych ;-)




Podobne postybeta
Focus
Czemu deploymenty są takie trudne?
Taki tam rant po Gradle i Dockerze ;-)
Serwisy mniejszej miłości ;-)
Jak walczyć z gigantycznym kodem w Java'ie, część 1 ;-)

Brak komentarzy:

Prześlij komentarz