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 ;-)
Chrome2ChromeV2 na GitHub :-)
Brak komentarzy:
Prześlij komentarz