Samouczek: automatyzowanie kompilacji obrazu kontenera po zaktualizowaniu obrazu podstawowego w innym prywatnym rejestrze kontenerów

Usługa ACR Tasks obsługuje automatyczne kompilacje obrazów po zaktualizowaniu obrazu podstawowego kontenera, na przykład w przypadku 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:

  • Kompilowanie obrazu podstawowego w rejestrze podstawowym
  • Tworzenie zadania kompilacji aplikacji w innym rejestrze w celu śledzenia obrazu podstawowego
  • Aktualizowanie obrazu podstawowego w celu wyzwolenia zadania obrazu aplikacji
  • Wyświetlanie wyzwolonego zadania
  • Weryfikowanie zaktualizowanego obrazu aplikacji

Wymagania wstępne

Ukończenie poprzednich samouczków

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
  • Tworzenie rozwidlenia 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ść wszędzie tam, gdzie będzie wyświetlana 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 programowania umożliwiający zarządzanie obrazami podstawowymi w typowym, 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 opracowują obrazy aplikacji we własnych rejestrach, mogą uzyskać dostęp do zestawu obrazów podstawowych przechowywanych w typowym rejestrze podstawowym. Rejestr podstawowy może znajdować się w innym regionie, a nawet w replikacji geograficznej.

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 usługa ACR Tasks wypycha nowy obraz podstawowy do rejestru, następuje automatyczne wyzwolenie kompilacji obrazu aplikacji. Opcjonalnie możesz uruchomić obraz kontenera aplikacji lokalnie, aby zobaczyć inne ciągi wersji we wbudowanych obrazach.

W tym samouczku zadanie usługi ACR kompiluje i wypycha obraz kontenera aplikacji określony w pliku Dockerfile. Zadania usługi ACR mogą również uruchamiać zadania wieloetapowe, używając pliku YAML do definiowania kroków do kompilowania, 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 .

Tworzenie zadania śledzenia prywatnego obrazu podstawowego

Następnie utwórz zadanie w rejestrze obrazów aplikacji za pomocą polecenia az acr task create, włączając tożsamość zarządzaną. 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 obraz podstawowy (FROM node:15-alpine), plik Dockerfile w tym zadaniu, dockerfile-app, określa obraz podstawowy w rejestrze obrazów podstawowych:

FROM ${REGISTRY_NAME}/baseimages/node:15-alpine

Ta konfiguracja ułatwia symulowanie poprawki struktury w obrazie podstawowym w dalszej części tego samouczka.

Nadawanie tożsamości uprawnień ściągnięcia do rejestru podstawowego

Aby nadać tożsamości zarządzanej zadania uprawnienia do ściągania obrazów z rejestru obrazów podstawowych, najpierw uruchom polecenie az acr task show , aby uzyskać identyfikator jednostki usługi tożsamości. 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 

Dodawanie poświadczeń rejestru docelowego do zadania

Uruchom polecenie az acr task credential add , aby dodać poświadczenia do zadania. Przekaż parametr , --use-identity [system] aby wskazać, że tożsamość zarządzana przypisana przez system 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 polecenia az acr task run , aby ręcznie wyzwolić zadanie i skompilować 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ą polecenia az acr login:

az acr login --name $ACR_NAME

Teraz uruchom komputer lokalnie przy użyciu polecenia docker run. Zastąp <ciąg run-id> identyfikatorem uruchomienia znalezionym w danych wyjściowych z poprzedniego kroku (na przykład "da6"). W tym przykładzie nazwa kontenera myapp i zawiera parametr do --rm usunięcia kontenera po jego zatrzymaniu.

docker run -d -p 8080:80 --name myapp --rm $ACR_NAME.azurecr.io/helloworld:<run-id>

Przejdź do elementu http://localhost:8080 w przeglądarce. Powinien zostać wyświetlony numer wersji środowiska Node.js renderowany na stronie internetowej, podobny do następującego. W kolejnym kroku wersja zostanie zwiększona przez dodanie „a” do ciągu wersji.

Zrzut ekranu przedstawiający przykładową aplikację w przeglądarce

Aby zatrzymać i usunąć kontener, uruchom następujące polecenie:

docker stop myapp

Tworzenie listy kompilacji

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 .

Gdy kompilacja zostanie ukończona i usługa ACR Tasks wypchnie nowy obraz podstawowy do rejestru, następuje wyzwolenie kompilacji obrazu aplikacji. Może upłynąć kilka minut, zanim utworzone wcześniej zadanie wyzwoli kompilację obrazu aplikacji, ponieważ musi wykryć nowo utworzony i wypchnięty obraz podstawowy.

Utworzenie listy zaktualizowanej kompilacji

Teraz, gdy obraz podstawowy został skompilowany, ponownie utwórz listę przebiegów zadań w celu porównania ze starszą 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. Element TRIGGER (wyzwalacz) dla ostatnio wykonanej kompilacji powinien mieć wartość „Aktualizacja obrazu”, wskazując, że zadanie zostało uruchomione przez funkcję szybkiego zadania 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 PRZEBIEGU dla kompilacji wyzwalanej 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 element <run-id> identyfikatorem przebiegu 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:

Zrzut ekranu przedstawiający zaktualizowaną przykładową aplikację w przeglądarce

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 pobrała zmianę do obrazu podstawowego i automatycznie ponownie skompilowała obraz aplikacji.

Aby zatrzymać i usunąć kontener, uruchom następujące polecenie:

docker stop updatedapp

Następne kroki

W tym samouczku przedstawiono sposób konfigurowania zadania w celu automatycznego wyzwalania kompilacji obrazu kontenera po zaktualizowaniu obrazu podstawowego powiązanego z obrazem. Teraz przejdź do następnego samouczka, aby dowiedzieć się, jak wyzwalać zadania zgodnie ze zdefiniowanym harmonogramem.