Powiedz, że mam trywialny kontener oparty na ubuntu:latest
. Teraz jest aktualizacja zabezpieczeń i ubuntu:latest
jest aktualizowana w repozytorium dokera.
Skąd mam wiedzieć, że mój lokalny obraz i jego kontenery biegną?
Czy istnieje jakaś najlepsza praktyka w zakresie automatycznego aktualizowania lokalnych obrazów i kontenerów w celu śledzenia aktualizacji repozytorium dokującego, co w praktyce zapewniłoby takie same upodobania, jak w przypadku nienadzorowanej aktualizacji działającej na konwencjonalnej maszynie ubuntu
docker
automatic-updates
Hbogert
źródło
źródło
Odpowiedzi:
Jednym ze sposobów, aby to zrobić, jest przejęcie tego przez systemy CI / CD. Po zbudowaniu obrazu nadrzędnego możesz mieć coś, co skanuje repozytorium git w poszukiwaniu obrazów przy użyciu tego rodzica. Jeśli zostanie znaleziony, wyślesz żądanie ściągnięcia, aby podskoczyć do nowych wersji obrazu. Żądanie ściągnięcia, jeśli wszystkie testy zakończą się pomyślnie, zostanie scalone, a otrzymasz nowy obraz potomny na podstawie zaktualizowanego elementu nadrzędnego. Przykład narzędzia stosującego to podejście można znaleźć tutaj: https://engineering.salesforce.com/open-sourcing-dockerfile-image-update-6400121c1a75 .
Jeśli nie kontrolujesz swojego wizerunku rodzica, tak jak w przypadku urzędnika
ubuntu
obrazu , możesz napisać narzędzia wykrywające zmiany w znaczniku obrazu nadrzędnego lub sumie kontrolnej (nie to samo, tagi są zmienne) i wywoływać odpowiednio buduje obraz dzieci.źródło
Używamy skryptu, który sprawdza, czy działający kontener jest uruchamiany z najnowszym obrazem. Używamy również wstępnych skryptów inicjujących do uruchomienia obrazu dokera.
I wygląda na to, że init
źródło
redis
),LATEST=`docker inspect --format "{{.Id}}" $IMAGE`
Otrzyma informacje o kontenerze. Dodaj,--type image
aby to naprawić.for IMAGE in $(docker ps --format {{.Image}} -q | sort -u)
„Sposób dokowania” polegałby na użyciu automatycznych kompilacji centrum dokującego . Funkcja Łącza repozytorium przebuduje Twój kontener, gdy zostanie on odbudowany, a funkcja Webhooks wyśle Ci powiadomienie.
Wygląda na to, że haki są ograniczone do wywołań POST HTTP. Trzeba będzie skonfigurować usługę, aby je złapać, lub może użyć jednego z POST, aby wysłać pocztą e-mail usługi.
Nie zagłębiłem się w to, ale nowy uniwersalny samolot kontrolny Docker może mieć funkcję wykrywania zaktualizowanych kontenerów i ponownego wdrażania.
źródło
Możesz użyć Strażnicy można obserwować aktualizacje obrazu, z którego utworzono instancję kontenera, a następnie automatycznie pobrać aktualizację i ponownie uruchomić kontener, używając zaktualizowanego obrazu. Nie rozwiązuje to jednak problemu przebudowywania własnych obrazów niestandardowych, gdy następuje zmiana obrazu wyjściowego, na którym jest oparty. Można to potraktować jako dwuczęściowy problem: (1) wiedząc, kiedy obraz nadrzędny został zaktualizowany, i (2) wykonując rzeczywistą odbudowę obrazu. (1) można rozwiązać dość łatwo, ale (2) wiele zależy od lokalnego środowiska / praktyk kompilacji, więc prawdopodobnie trudniej jest stworzyć uogólnione rozwiązanie.
Jeśli możesz korzystać ze zautomatyzowanych kompilacji Docker Hub , cały problem można rozwiązać stosunkowo czysto za pomocą funkcji łączy repozytorium , która pozwala automatycznie uruchomić przebudowę po aktualizacji połączonego repozytorium (prawdopodobnie wcześniejszego). Możesz również skonfigurować hak internetowy, aby powiadamiał Cię o automatycznej kompilacji. Jeśli chcesz otrzymywać powiadomienia e-mail lub SMS, możesz podłączyć hak internetowy do IFTTT Maker . Stwierdziłem, że interfejs użytkownika IFTTT jest nieco mylący, ale skonfigurowałbyś hak internetowy Dockera, aby publikować na https://maker.ifttt.com/trigger/
docker_xyz_image_built
/ with / key /your_key
.Jeśli musisz budować lokalnie, możesz przynajmniej rozwiązać problem z otrzymywaniem powiadomień, gdy aktualizowany jest obraz wyjściowy, tworząc fałszywe repozytorium w Docker Hub połączone z Twoimi interesującymi repozytoriami. Jedynym celem atrapowego repozytorium byłoby wywołanie haka sieciowego po jego odbudowaniu (co oznacza, że jedno z powiązanych repozytoriów zostało zaktualizowane). Jeśli możesz otrzymać ten hak internetowy, możesz go nawet użyć do uruchomienia odbudowy po swojej stronie.
źródło
REPO_USER
iREPO_PASS
zmiennych środowiskowych. Spójrz na readme.md ze Strażnicy, aby uzyskać więcej informacji: github.com/v2tec/watchtower#usageMiałem ten sam problem i pomyślałem, że można go po prostu rozwiązać,
unattended-upgrade
codziennie dzwoniąc do pracy crona .Zamierzam mieć to jako automatyczne i szybkie rozwiązanie zapewniające bezpieczeństwo i aktualizację kontenera produkcyjnego, ponieważ może to zająć trochę czasu, aby zaktualizować moje obrazy i wdrożyć nowy obraz dokera z najnowszymi aktualizacjami zabezpieczeń.
Możliwe jest również zautomatyzowanie budowania i wdrażania obrazu za pomocą haków Github
Stworzyłem podstawowy obraz dokera, który automatycznie sprawdza i instaluje codziennie aktualizacje zabezpieczeń (może być uruchamiany bezpośrednio przez
docker run itech/docker-unattended-upgrade
).Natknąłem się również na inne podejście, aby sprawdzić, czy kontener wymaga aktualizacji.
Moja pełna realizacja:
Plik Docker
Skrypty pomocnicze
zainstalować
początek
Edytować
Opracowałem małe narzędzie do uruchamiania dokerów, które działa jako kontener dokerów i może być używane do aktualizacji pakietów we wszystkich lub wybranych uruchomionych kontenerach, może także służyć do uruchamiania dowolnych poleceń.
Można go łatwo przetestować za pomocą następującego polecenia:
docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run exec
który domyślnie wykona
date
polecenie we wszystkich działających kontenerach i wyświetli wyniki. Jeśli podaszupdate
zamiast tegoexec
, zostanie wykonany,apt-get update
a następnieapt-get upgrade -y
we wszystkich uruchomionych kontenerachźródło
Kubernetes
przydatny przy wdrażaniu dużej infrastruktury, ale Google wciąż go rozwija. W tej chwili możesz to zautomatyzować za pomocą narzędzia do obsługi administracyjnej, takiego jak Ansible, w dość prosty sposób.Nie wiedziałbyś, że twój kontener jest z tyłu bez uruchomienia ściągacza dokującego . Następnie musisz odbudować lub ponownie skomponować obraz.
Polecenia można umieścić w skrypcie wraz ze wszystkim innym, co jest konieczne do ukończenia aktualizacji, chociaż odpowiedni kontener nie potrzebuje niczego dodatkowego.
źródło
Zarządzanie zależnościami dla obrazów Docker to prawdziwy problem. Należę do zespołu, który zbudował narzędzie MicroBadger , które pomaga w tym, monitorując obrazy kontenerów i sprawdzając metadane. Jedną z jego funkcji jest umożliwienie skonfigurowania haka do powiadomień, który będzie wywoływany, gdy zmieni się obraz, który Cię interesuje (np. Obraz podstawowy).
źródło
Tutaj jest wiele odpowiedzi, ale żadna z nich nie odpowiada moim potrzebom. Chciałem rzeczywistej odpowiedzi na pytanie nr 1 pytającego. Skąd mam wiedzieć, kiedy obraz jest aktualizowany na hub.docker.com?
Poniższy skrypt można uruchamiać codziennie. Przy pierwszym uruchomieniu pobiera linię bazową znaczników i aktualizuje daty z rejestru HUB i zapisuje je lokalnie. Odtąd za każdym razem, gdy jest uruchamiany, sprawdza rejestr pod kątem nowych znaczników i dat aktualizacji. Ponieważ zmienia się to za każdym razem, gdy istnieje nowy obraz, informuje nas, czy zmienił się obraz podstawowy. Oto skrypt:
Będziesz chciał zmienić
DATAPATH
zmienną u góry i zmienić polecenie powiadomienia e-mail na końcu, aby dostosować je do swoich potrzeb. Dla mnie mam SSH do serwera w innej sieci, w której znajduje się mój SMTP. Ale możesz łatwo użyćmail
polecenia.Teraz chcesz również sprawdzić zaktualizowane pakiety w samych kontenerach. Jest to prawdopodobnie bardziej efektywne niż „ściąganie”, gdy twoje pojemniki działają. Oto skrypt, aby to zrobić:
źródło
Innym podejściem może być założenie, że obraz podstawowy dość szybko się opóźnia (i bardzo prawdopodobne, że tak się stanie) i wymuszanie okresowego kompilowania obrazu aplikacji (np. Co tydzień), a następnie ponowne wdrożenie go, jeśli uległo zmianie.
O ile mi wiadomo, popularne obrazy podstawowe, takie jak oficjalna Debian lub Java, aktualizują swoje tagi, aby uwzględnić poprawki bezpieczeństwa, więc tagi nie są niezmienne (jeśli chcesz silniejszej gwarancji, że musisz użyć referencji [image: @digest ], dostępne w nowszych wersjach Docker). Dlatego jeśli chcesz zbudować obraz
docker build --pull
, aplikacja powinna uzyskać najnowszy i największy z podstawowych znaczników obrazu, do których się odwołujesz.Ponieważ zmienne tagi mogą być mylące, najlepiej zwiększać numer wersji aplikacji za każdym razem, gdy to robisz, aby przynajmniej po twojej stronie wszystko było czystsze.
Nie jestem więc pewien, czy skrypt zasugerowany w jednej z poprzednich odpowiedzi spełnia swoje zadanie, ponieważ nie odbudowuje obrazu twojej aplikacji - po prostu aktualizuje podstawowy znacznik obrazu, a następnie uruchamia ponownie kontener, ale nowy kontener wciąż się odwołuje stary skrót obrazu podstawowego.
Nie opowiadałbym się za uruchamianiem zadań typu cron w kontenerach (lub innych procesach, chyba że jest to naprawdę konieczne), ponieważ jest to sprzeczne z mantrą uruchamiania tylko jednego procesu na kontener (istnieją różne argumenty na temat tego, dlaczego jest to lepsze, więc „ nie zamierzam tu wchodzić).
źródło
Nie zastanawiam się nad tym, czy chcesz produkować nienadzorowane aktualizacje (chyba nie). Zostawiam to tutaj w celach informacyjnych na wypadek, gdyby ktoś uznał to za przydatne. Zaktualizuj wszystkie obrazy dokerów do najnowszej wersji za pomocą następującego polecenia w terminalu:
# docker images | awk '(NR>1) && ($2!~/none/) {print $1":"$2}' | xargs -L1 docker pull
źródło
# docker system prune -a --volumes -f
aby posprzątać stare (wiszące) obrazy, tomy itp.AKTUALIZACJA: Użyj Dependabot - https://dependabot.com/docker/
BLUF: znalezienie odpowiedniego punktu wstawienia do monitorowania zmian w kontenerze jest wyzwaniem. Byłoby wspaniale, gdyby DockerHub to rozwiązał. (Łącza do repozytorium zostały wspomniane, ale należy pamiętać, że podczas konfigurowania ich w DockerHub - „ Uruchom kompilację w tym repozytorium, ilekroć obraz podstawowy jest aktualizowany w Docker Hub. Działa tylko w przypadku obrazów nieoficjalnych.” )
Próbując rozwiązać ten problem sam, widziałem kilka rekomendacji dotyczących haków internetowych, więc chciałem rozwinąć kilka rozwiązań, z których skorzystałem.
Skorzystaj z witryny microbadger.com, aby śledzić zmiany w kontenerze, i użyj funkcji haka powiadomień, aby wywołać akcję. Skonfigurowałem to za pomocą zapier.com (ale możesz użyć dowolnej dostosowywanej usługi webhook), aby utworzyć nowy problem w moim repozytorium github, który używa Alpine jako obrazu podstawowego.
Śledź kanał RSS dla git commits do nadrzędnego kontenera. dawny. https://github.com/gliderlabs/docker-alpine/commits/rootfs/library-3.8/x86_64 . Użyłem zapier.com do monitorowania tego kanału i wyzwalania automatycznej kompilacji mojego kontenera w Travis-CI za każdym razem, gdy coś zostało popełnione. Jest to trochę ekstremalne, ale możesz zmienić wyzwalacz, aby wykonywać inne czynności, takie jak otwieranie problemu w repozytorium git w celu ręcznej interwencji.
źródło
Przesłanka do mojej odpowiedzi:
Podejście
Dodatkowo obraz podstawowy można ulepszyć / kontener z kompletnie nowym obrazem podstawowym można budować w regularnych odstępach czasu, ponieważ opiekun uzna to za konieczne
Zalety
źródło
Powyższe odpowiedzi są również poprawne
Istnieją dwa podejścia
Właśnie udostępniam skrypt, może ci to pomóc! Możesz go używać z cronjobem, próbowałem z powodzeniem na OSX
Oto mój plik skomponowania dokera
źródło
Umieść pracę za pośrednictwem
$ crontab -e
:Utwórz
~/.docker
katalog z plikiemcron.sh
:źródło
próbowałeś tego: https://github.com/v2tec/watchtower . jest to proste narzędzie działające w kontenerze dokowanym, obserwujące inne kontenery, jeśli zmieni się ich podstawowy obraz, pociągnie i wdroży.
źródło
Prostym i doskonałym rozwiązaniem jest pasterz
źródło