Jestem trochę zdezorientowany tymi dwiema opcjami. Wydają się być spokrewnieni. Jednak nie są one tak naprawdę kompatybilne.
Na przykład wydaje się, że używanie Dockerfiles oznacza, że nie powinieneś tak naprawdę angażować się w obrazy, ponieważ tak naprawdę powinieneś po prostu śledzić plik Dockerfile w git i wprowadzać w nim zmiany. Wtedy nie ma dwuznaczności co do tego, co jest autorytatywne.
Jednak zmiany obrazu wydają się naprawdę ładne. To tak wspaniałe, że możesz po prostu bezpośrednio zmodyfikować kontener i oznaczyć zmiany, aby utworzyć inny obraz. Rozumiem, że możesz nawet uzyskać coś w rodzaju różnicy systemu plików z historii zatwierdzania obrazu. Niesamowite. Ale wtedy nie powinieneś używać Dockerfiles. W przeciwnym razie, jeśli dokonałeś zatwierdzenia obrazu, będziesz musiał wrócić do swojego pliku Dockerfile i wprowadzić jakąś zmianę, która reprezentuje to, co zrobiłeś.
Więc jestem rozdarty. Podoba mi się idea zatwierdzeń obrazu: nie musisz przedstawiać stanu obrazu w pliku Dockerfile - możesz go po prostu śledzić bezpośrednio. Ale niepokoję się rezygnacją z pomysłu na jakiś rodzaj pliku manifestu, który daje szybki przegląd tego, co jest na obrazie. Niepokojące jest również zobaczenie dwóch funkcji w tym samym pakiecie oprogramowania, które wydają się niekompatybilne.
Czy ktoś ma jakieś przemyślenia na ten temat? Czy używanie zatwierdzeń obrazu jest uważane za złą praktykę? A może powinienem po prostu puścić mój załącznik, aby zamanifestować pliki z dni Puppet? Co powinienem zrobić?
Aktualizacja :
Do wszystkich, którzy uważają, że jest to pytanie oparte na opiniach, nie jestem tego taki pewien. Jest w tym kilka subiektywnych cech, ale myślę, że jest to głównie pytanie obiektywne. Ponadto uważam, że dobra dyskusja na ten temat będzie miała charakter informacyjny.
Na koniec mam nadzieję, że każdy, kto czyta ten post, lepiej zrozumie, w jaki sposób pliki Dockerfiles i zobowiązania dotyczące obrazu odnoszą się do siebie.
Aktualizacja - 2017/7/18 :
Niedawno odkryłem legalne użycie zatwierdzeń obrazu. Właśnie utworzyliśmy potok CI w naszej firmie i podczas jednego etapu potoku nasze testy aplikacji są uruchamiane wewnątrz kontenera. Musimy pobrać wyniki pokrycia z opuszczonego kontenera po wygenerowaniu ich przez proces uruchamiający testy (w systemie plików kontenera) i zatrzymaniu działania kontenera. Używamy do tego zatwierdzeń obrazu, zatwierdzając zatrzymany kontener w celu utworzenia nowego obrazu, a następnie uruchamiając polecenia, które wyświetlają i zrzucają plik pokrycia na standardowe wyjście. Więc warto to mieć. Oprócz tego bardzo konkretnego przypadku używamy Dockerfiles do definiowania naszych środowisk.
Odpowiedzi:
Dockerfiles to narzędzie służące do tworzenia obrazów.
Wynikiem działania
docker build .
jest obraz z zatwierdzeniem, więc nie można użyć pliku Dockerfile bez utworzenia zatwierdzenia . Pytanie brzmi, czy należy aktualizować obraz ręcznie za każdym razem, gdy coś się zmieni, a tym samym skazać się na przekleństwo złotego obrazu ?Klątwa złotego obrazu jest straszną klątwą rzuconą na ludzi, którzy muszą nadal żyć z błędnym obrazem bazowym, na którym znajduje się dziura w zabezpieczeniach, aby uruchomić swoje oprogramowanie, ponieważ osoba, która go stworzyła, została dawno pożarta przez starożytnych (lub przeniosła się do nowa praca) i nikt nie wie, skąd wzięli wersję imagemagii, która znalazła się w tym obrazie. i jest jedyną rzeczą, która będzie łączyła się z modułem c ++ dostarczonym przez tego konsultanta, którego syn szefa zatrudnił trzy lata temu, i tak czy owak to nie ma znaczenia, ponieważ nawet jeśli zorientowałeś się, skąd imagemagic pochodzi wersja libstdc ++ używana przez JNI wzywa narzędzie wsparcia, które stażysta z utworzonymi długimi włosami i tak istnieje tylko w nieobsługiwanej wersji Ubuntu.
źródło
Znajomość zarówno zalet, jak i niewygodności rozwiązań to dobry początek. Ponieważ połączenie tych dwóch jest prawdopodobnie właściwą drogą.
Wada: unikaj ślepej uliczki złotego obrazu :
Używanie samych zatwierdzeń jest złe, jeśli nie wiesz, jak odbudować swój obraz. Nie chcesz być w stanie, w którym nie możesz odbudować obrazu . Ten stan końcowy jest tutaj nazywany złotym obrazem, ponieważ obraz będzie jedynym punktem odniesienia, punktem początkowym i końcowym na każdym etapie. Jeśli go zgubisz, będziesz miał dużo kłopotów, ponieważ nie możesz go odbudować. Fatalnym ślepym zaułkiem jest to, że pewnego dnia będziesz musiał odbudować nową (ponieważ na przykład wszystkie biblioteki systemowe są przestarzałe) i nie będziesz miał pojęcia, co zainstalować ... kończąc się dużą stratą czasu.
Na marginesie , jest prawdopodobne, że używanie zatwierdzeń zamiast zatwierdzeń byłoby przyjemniejsze, gdyby dziennik historii był łatwy w użyciu (zapoznaj się z różnicami i powtórz je na innych obrazach), tak jak to jest w git: zauważysz, że git nie ma ten dylemat.
Pro: zgrabne aktualizacje do dystrybucji
Z drugiej strony, zatwierdzanie warstw ma znaczną przewagę pod względem rozproszonych uaktualnień, a tym samym pod względem przepustowości i czasu wdrażania. Jeśli zaczniesz obsługiwać obrazy dockera tak, jak piekarz obsługuje naleśniki (na co pozwala docker), lub chcesz natychmiast wdrożyć wersję testową, z przyjemnością wyślesz niewielką aktualizację w postaci małego zatwierdzenia, a nie zupełnie nowy obraz. Zwłaszcza w przypadku ciągłej integracji dla klientów, w przypadku których poprawki błędów powinny być wdrażane szybko i często.
Spróbuj uzyskać to, co najlepsze z dwóch światów:
W tego typu scenariuszach prawdopodobnie będziesz chciał oznaczyć główną wersję swoich obrazów i powinny one pochodzić
Dockerfiles
. Możesz zapewnić ciągłe wersje integracyjne dzięki zatwierdzeniom opartym na oznaczonej wersji. Zmniejsza to zalety i niedogodności związane ze scenariuszem zatwierdzania plików Dockerfiles i warstwami. Tutaj kluczową kwestią jest to, że nigdy nie przestajesz śledzić swoich obrazów, ograniczając liczbę zatwierdzeń, które pozwolisz na ich wykonanie.Więc myślę, że zależy to od twojego scenariusza i prawdopodobnie nie powinieneś próbować znaleźć jednej reguły. Jednak mogą istnieć prawdziwe ślepe zaułki, których naprawdę powinieneś unikać (jako kończące się scenariuszem „złotego obrazu”), niezależnie od rozwiązania.
źródło