Samouczek: Automatyczne tworzenie obrazu kontenera po zaktualizowaniu obrazu bazowego w innym prywatnym rejestrze kontenerów
Usługa ACR Tasks obsługuje automatyczne kompilacje obrazów, gdy obraz podstawowy kontenera jest aktualizowany, na przykład podczas stosowania poprawek do systemu operacyjnego lub struktury aplikacji w jednym z obrazów podstawowych.
Z tego samouczka dowiesz się, jak utworzyć zadanie usługi ACR, które wyzwala kompilację w chmurze po wypchnięciu obrazu podstawowego kontenera do innego rejestru kontenerów platformy Azure. Możesz również wypróbować samouczek, aby utworzyć zadanie usługi ACR, które wyzwala kompilację obrazu, gdy obraz podstawowy jest wypychany do tego samego rejestru kontenerów platformy Azure.
W tym samouczku:
- Tworzenie obrazu bazowego w rejestrze bazowym
- Utwórz zadanie budowania aplikacji w innym rejestrze, aby śledzić obraz bazowy.
- Zaktualizuj obraz bazowy, aby wyzwolić zadanie obrazu aplikacji
- Pokaż wyzwolone zadanie
- Weryfikowanie zaktualizowanego obrazu aplikacji
Wymagania wstępne
Ukończ poprzednie samouczki
W tym samouczku założono, że środowisko zostało już skonfigurowane i wykonano kroki opisane w dwóch pierwszych samouczkach z serii, w których wykonano następujące czynności:
- Tworzenie rejestru kontenerów platformy Azure
- Rozwidlenie przykładowego repozytorium
- Klonowanie przykładowego repozytorium
- Tworzenie osobistego tokenu dostępu usługi GitHub
Jeśli jeszcze tego nie zrobiono, przed kontynuowaniem wykonaj następujące samouczki:
Tworzenie obrazów kontenera w chmurze przy użyciu usługi Azure Container Registry Tasks
Automatyzowanie kompilacji obrazu kontenera za pomocą usługi Azure Container Registry Tasks
Oprócz rejestru kontenerów utworzonego na potrzeby poprzednich samouczków należy utworzyć rejestr do przechowywania obrazów podstawowych. Jeśli chcesz, utwórz drugi rejestr w innej lokalizacji niż oryginalny rejestr.
Konfigurowanie środowiska
Wypełnij te zmienne środowiskowe powłoki przy użyciu wartości odpowiednich dla danego środowiska. Ten krok nie jest ściśle wymagany, ale trochę ułatwia wykonywanie przedstawionych w tym samouczku wielowierszowych poleceń interfejsu wiersza polecenia platformy Azure. Jeśli te zmienne środowiskowe nie zostaną wypełnione, należy ręcznie zastąpić każdą wartość w każdym miejscu, gdzie się pojawia w przykładowych poleceniach.
BASE_ACR=<base-registry-name> # The name of your Azure container registry for base images
ACR_NAME=<registry-name> # The name of your Azure container registry for application images
GIT_USER=<github-username> # Your GitHub user account name
GIT_PAT=<personal-access-token> # The PAT you generated in the second tutorial
Scenariusz aktualizacji obrazu podstawowego
W tym samouczku przedstawiono scenariusz aktualizacji obrazu podstawowego. Ten scenariusz odzwierciedla przepływ pracy deweloperskiej do zarządzania obrazami podstawowymi w wspólnym, prywatnym rejestrze kontenerów podczas tworzenia obrazów aplikacji w innych rejestrach. Obrazy podstawowe mogą określać typowe systemy operacyjne i struktury używane przez zespół, a nawet typowe składniki usługi.
Na przykład deweloperzy, którzy tworzą obrazy aplikacji we własnych rejestrach, mogą uzyskiwać dostęp do zestawu obrazów podstawowych przechowywanych w typowym rejestrze podstawowym. Rejestr podstawowy może znajdować się w innym regionie, a nawet być zreplikowany geograficznie.
Przykładowy kod obejmuje dwa pliki Dockerfile: obraz aplikacji i obraz określony w nim jako podstawowy. W poniższych sekcjach utworzysz zadanie usługi ACR, które automatycznie wyzwala kompilację obrazu aplikacji, gdy nowa wersja obrazu podstawowego zostanie wypchnięta do innego rejestru kontenerów platformy Azure.
Dockerfile-app: mała aplikacja internetowa Node.js, która renderuje statyczną stronę internetową wyświetlającą wersję środowiska Node.js, na której się opiera. Ciąg wersji jest symulowany: wyświetla zawartość zmiennej środowiskowej
NODE_VERSION
, którą zdefiniowano w obrazie podstawowym.Dockerfile-base: obraz, który plik
Dockerfile-app
określa jako podstawowy. Opiera się ona na obrazie Node i uwzględnia zmienną środowiskowąNODE_VERSION
.
W poniższych sekcjach utworzysz zadanie, zaktualizujesz wartość NODE_VERSION
w pliku Dockerfile obrazu podstawowego, a następnie użyjesz usługi ACR Tasks do skompilowania obrazu podstawowego. Gdy zadanie ACR wypycha nowy obraz podstawowy do twojego rejestru, automatycznie wyzwala kompilację obrazu aplikacji. Opcjonalnie możesz uruchomić obraz kontenera aplikacji lokalnie, aby zobaczyć inne ciągi wersji we wbudowanych obrazach.
W tym samouczku twoje zadanie ACR kompiluje i wypycha obraz kontenera aplikacji zdefiniowany w pliku Dockerfile. Usługa ACR Tasks może również uruchamiać zadania wieloetapowe, używając pliku YAML do definiowania kroków tworzenia, wypychania i opcjonalnie testowania wielu kontenerów.
Tworzenie obrazu podstawowego
Zacznij od utworzenia obrazu podstawowego za pomocą szybkiego zadania usługi ACR Tasks przy użyciu polecenia az acr build. Zgodnie z opisem w pierwszym samouczku z serii, w tym procesie następuje nie tylko kompilacja obrazu, ale także wypchnięcie go do rejestru kontenerów, jeśli kompilacja zakończy się pomyślnie. W tym przykładzie obraz jest wypychany do rejestru obrazów podstawowych.
az acr build --registry $BASE_ACR --image baseimages/node:15-alpine --file Dockerfile-base .
Utwórz zadanie do śledzenia prywatnego obrazu podstawowego
Następnie utwórz zadanie w rejestrze obrazów aplikacji za pomocą az acr task create, włączając zarządzaną tożsamość. Tożsamość zarządzana jest używana w kolejnych krokach, aby zadanie uwierzytelniało się w rejestrze obrazów podstawowych.
W tym przykładzie użyto tożsamości przypisanej przez system, ale w niektórych scenariuszach można utworzyć i włączyć tożsamość zarządzaną przypisaną przez użytkownika. Aby uzyskać szczegółowe informacje, zobacz Cross-registry authentication in an ACR task using an Azure-managed identity (Uwierzytelnianie między rejestrami w zadaniu usługi ACR przy użyciu tożsamości zarządzanej platformy Azure).
az acr task create \
--registry $ACR_NAME \
--name baseexample2 \
--image helloworld:{{.Run.ID}} \
--context https://github.com/$GIT_USER/acr-build-helloworld-node.git#main \
--file Dockerfile-app \
--git-access-token $GIT_PAT \
--arg REGISTRY_NAME=$BASE_ACR.azurecr.io \
--assign-identity
To zadanie jest podobne do zadania utworzonego w poprzednim samouczku. Przesyła ono do usługi ACR Tasks instrukcję wyzwolenia kompilacji obrazu, gdy zatwierdzenia są wypychane do repozytorium określonego przez element --context
. Podczas gdy plik Dockerfile używany do kompilowania obrazu w poprzednim samouczku określa publiczny bazowy obraz (FROM node:15-alpine
), plik Dockerfile w tym zadaniu, Dockerfile-app, określa bazowy obraz w rejestrze obrazów bazowych.
FROM ${REGISTRY_NAME}/baseimages/node:15-alpine
Ta konfiguracja ułatwia symulowanie poprawki platformy na obrazie podstawowym w dalszej części tego samouczka.
Przyznaj uprawnienia do pobierania tożsamości z rejestru podstawowego
Aby nadać tożsamości zarządzanej zadania uprawnienia do pobierania obrazów z rejestru bazowych obrazów, najpierw uruchom polecenie az acr task show, aby uzyskać identyfikator jednostki usługi. Następnie uruchom polecenie az acr show , aby uzyskać identyfikator zasobu rejestru podstawowego:
# Get service principal ID of the task
principalID=$(az acr task show --name baseexample2 --registry $ACR_NAME --query identity.principalId --output tsv)
# Get resource ID of the base registry
baseregID=$(az acr show --name $BASE_ACR --query id --output tsv)
Przypisz uprawnienia ściągania tożsamości zarządzanej do rejestru, uruchamiając polecenie az role assignment create:
az role assignment create \
--assignee $principalID \
--scope $baseregID --role acrpull
Dodaj poświadczenia rejestru docelowego do zadania
Uruchom az acr task credential add, aby dodać poświadczenia do zadania.
--use-identity [system]
Przekaż parametr, aby wskazać, że przypisana przez system tożsamość zarządzana zadania może uzyskać dostęp do poświadczeń.
az acr task credential add \
--name baseexample2 \
--registry $ACR_NAME \
--login-server $BASE_ACR.azurecr.io \
--use-identity [system]
Ręczne uruchamianie zadania
Użyj az acr task run, aby ręcznie wyzwolić zadanie i zbudować obraz aplikacji. Ten krok jest potrzebny, aby zadanie śledziło zależność obrazu aplikacji od obrazu podstawowego.
az acr task run --registry $ACR_NAME --name baseexample2
Po ukończeniu zadania zanotuj identyfikator przebiegu (na przykład „da6”), jeśli chcesz wykonać poniższy krok opcjonalny.
Opcjonalnie: lokalne uruchamianie aplikacji kontenera
Jeśli pracujesz lokalnie (nie w usłudze Cloud Shell) i masz zainstalowaną platformę Docker, uruchom kontener, aby zobaczyć renderowaną aplikację w przeglądarce internetowej przed ponownym skompilowaniem jej obrazu podstawowego. Jeśli używasz usługi Cloud Shell, pomiń tę sekcję (usługa Cloud Shell nie obsługuje poleceń az acr login
ani docker run
).
Najpierw uwierzytelnij się w rejestrze kontenerów za pomocą az acr login:
az acr login --name $ACR_NAME
Teraz uruchom kontener lokalnie za pomocą docker run
. Zastąp element <run-id> identyfikatorem przebiegu znalezionym w danych wyjściowych poprzedniego kroku (na przykład „da6”). W tym przykładzie nazwa kontenera myapp
i zawiera --rm
parametr umożliwiający usunięcie kontenera po jego zatrzymaniu.
docker run -d -p 8080:80 --name myapp --rm $ACR_NAME.azurecr.io/helloworld:<run-id>
Przejdź do http://localhost:8080
w Twojej przeglądarce. Powinien zostać wyświetlony numer wersji środowiska Node.js na stronie internetowej, jak poniżej. W kolejnym kroku wersja zostanie zwiększona przez dodanie „a” do ciągu wersji.
Aby zatrzymać i usunąć kontener, uruchom następujące polecenie:
docker stop myapp
Wypisz kompilacje
Następnie utwórz listę przebiegów zadań, które wykonała usługa ACR Tasks dla rejestru, używając polecenia az acr task list-runs:
az acr task list-runs --registry $ACR_NAME --output table
Jeśli ukończono poprzedni samouczek (a rejestr nie został usunięty), powinny pojawić się dane wyjściowe podobne do poniższych. Zanotuj liczbę przebiegów zadań i najnowszą wartość RUN ID (identyfikator przebiegu), aby porównać dane wyjściowe po zaktualizowaniu obrazu podstawowego w następnej sekcji.
az acr task list-runs --registry $ACR_NAME --output table
UN ID TASK PLATFORM STATUS TRIGGER STARTED DURATION
-------- -------------- ---------- --------- ------------ -------------------- ----------
ca12 baseexample2 linux Succeeded Manual 2020-11-21T00:00:56Z 00:00:36
ca11 baseexample1 linux Succeeded Image Update 2020-11-20T23:38:24Z 00:00:34
ca10 taskhelloworld linux Succeeded Image Update 2020-11-20T23:38:24Z 00:00:24
cay linux Succeeded Manual 2020-11-20T23:38:08Z 00:00:22
cax baseexample1 linux Succeeded Manual 2020-11-20T23:33:12Z 00:00:30
caw taskhelloworld linux Succeeded Commit 2020-11-20T23:16:07Z 00:00:29
Aktualizowanie obrazu podstawowego
W tym miejscu przeprowadzisz symulację poprawki platformy w obrazie podstawowym. Edytuj plik Dockerfile-base i dodaj „a” po numerze wersji zdefiniowanym w elemencie NODE_VERSION
:
ENV NODE_VERSION 15.2.1a
Uruchom szybkie zadanie w celu skompilowania zmodyfikowanego obrazu podstawowego. Zanotuj identyfikator przebiegu w danych wyjściowych.
az acr build --registry $BASE_ACR --image baseimages/node:15-alpine --file Dockerfile-base .
Po zakończeniu kompilacji i wysłaniu nowego obrazu podstawowego przez usługę ACR Tasks do rejestru, następuje wyzwolenie kompilacji obrazu aplikacji. Może upłynąć kilka chwil, zanim wcześniej utworzone zadanie wyzwoli kompilację obrazu aplikacji, ponieważ musi ono zidentyfikować nowo utworzony i przesłany obraz podstawowy.
Lista zaktualizowanej wersji budowy
Teraz, gdy zaktualizowałeś obraz podstawowy, ponownie wypisz przebiegi zadań, aby porównać z poprzednią listą. Jeśli na początku dane wyjściowe nie różnią się, okresowo uruchamiaj polecenie, aby zobaczyć nowy przebieg zadania na liście.
az acr task list-runs --registry $ACR_NAME --output table
Dane wyjściowe będą podobne do następujących. Wyzwalacz dla ostatnio wykonanej kompilacji powinien mieć wartość „Aktualizacja obrazu”, co wskazuje, że zadanie zostało uruchomione przez szybkie zadanie dotyczące obrazu podstawowego.
az acr task list-runs --registry $ACR_NAME --output table
PLATFORM STATUS TRIGGER STARTED DURATION
-------- -------------- ---------- --------- ------------ -------------------- ----------
ca13 baseexample2 linux Succeeded Image Update 2020-11-21T00:06:00Z 00:00:43
ca12 baseexample2 linux Succeeded Manual 2020-11-21T00:00:56Z 00:00:36
ca11 baseexample1 linux Succeeded Image Update 2020-11-20T23:38:24Z 00:00:34
ca10 taskhelloworld linux Succeeded Image Update 2020-11-20T23:38:24Z 00:00:24
cay linux Succeeded Manual 2020-11-20T23:38:08Z 00:00:22
cax baseexample1 linux Succeeded Manual 2020-11-20T23:33:12Z 00:00:30
caw taskhelloworld linux Succeeded Commit 2020-11-20T23:16:07Z 00:00:29
Jeśli chcesz wykonać następujący opcjonalny krok uruchamiania nowo utworzonego kontenera, aby wyświetlić zaktualizowany numer wersji, zanotuj wartość IDENTYFIKATORA URUCHOMIENIA dla kompilacji wyzwolonej przez aktualizację obrazu (w poprzednich danych wyjściowych jest to "ca13").
Opcjonalnie: uruchamianie nowo utworzonego obrazu
Jeśli pracujesz lokalnie (nie w usłudze Cloud Shell) i masz zainstalowaną platformę Docker, uruchom nowy obraz aplikacji po ukończeniu kompilacji. Zastąp <run-id>
identyfikatorem RUN ID uzyskanym w poprzednim kroku. Jeśli używasz usługi Cloud Shell, pomiń tę sekcję (usługa Cloud Shell nie obsługuje polecenia docker run
).
docker run -d -p 8081:80 --name updatedapp --rm $ACR_NAME.azurecr.io/helloworld:<run-id>
Przejdź do elementu http://localhost:8081 w przeglądarce. Powinien zostać wyświetlony zaktualizowany numer wersji środowiska Node.js (z literą „a”) na stronie internetowej:
Pamiętaj, że obraz podstawowy został zaktualizowany za pomocą nowego numeru wersji, ale ostatnio skompilowany obraz aplikacji wyświetla nową wersję. Usługa ACR Tasks zarejestrowała zmianę w obrazie bazowym i automatycznie zbudowała ponownie obraz aplikacji.
Aby zatrzymać i usunąć kontener, uruchom następujące polecenie:
docker stop updatedapp
Następne kroki
W tym samouczku dowiesz się, jak używać zadania do automatycznego wyzwalania kompilacji obrazu kontenera po zaktualizowaniu jego obrazu podstawowego. Teraz przejdź do następnego samouczka, aby dowiedzieć się, jak wyzwalać zadania zgodnie ze zdefiniowanym harmonogramem.