Samouczek: automatyzowanie kompilacji obrazu kontenera po zaktualizowaniu obrazu podstawowego w rejestrze kontenerów platformy Azure

Usługa ACR Tasks obsługuje automatyczne kompilacje obrazu kontenera po zaktualizowaniu obrazu podstawowego kontenera, na przykład podczas stosowania poprawek 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 tego samego rejestru. Możesz również wypróbować samouczek, aby utworzyć zadanie usługi ACR, które wyzwala kompilację obrazu po wypchnięciu obrazu podstawowego do innego rejestru kontenerów platformy Azure.

W tym samouczku:

  • Tworzenie obrazu podstawowego
  • Tworzenie obrazu aplikacji w tym samym 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

Konfigurowanie środowiska

  • Ten artykuł wymaga wersji 2.0.46 lub nowszej interfejsu wiersza polecenia platformy Azure. W przypadku korzystania z usługi Azure Cloud Shell najnowsza wersja jest już zainstalowana.

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 jest wyświetlana w przykładowych poleceniach.

ACR_NAME=<registry-name>        # The name of your Azure container registry
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, w którym obraz podstawowy i obraz aplikacji są przechowywane w jednym rejestrze.

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 wyzwoli kompilację obrazu aplikacji, gdy nowa wersja obrazu podstawowego zostanie wypchnięta do tego samego rejestru kontenerów.

  • 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 tworzenia, wypychania i opcjonalnego 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.

az acr build --registry $ACR_NAME --image baseimages/node:15-alpine --file Dockerfile-base .

Tworzenie zadania podrzędnego

Następnie utwórz zadanie przy użyciu polecenia az acr task create:

az acr task create \
    --registry $ACR_NAME \
    --name baseexample1 \
    --image helloworld:{{.Run.ID}} \
    --arg REGISTRY_NAME=$ACR_NAME.azurecr.io \
    --context https://github.com/$GIT_USER/acr-build-helloworld-node.git#main \
    --file Dockerfile-app \
    --git-access-token $GIT_PAT

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, aplikacja Dockerfile, określa obraz podstawowy w tym samym rejestrze:

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

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

Kompilowanie kontenera aplikacji

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 baseexample1

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 należy uwierzytelnić 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> przebiegu znalezionym w danych wyjściowych z 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 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.

RUN ID    TASK            PLATFORM    STATUS     TRIGGER    STARTED               DURATION
--------  --------------  ----------  ---------  ---------  --------------------  ----------
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
cav       example2        linux       Succeeded  Commit     2020-11-20T23:16:07Z  00:00:55
cau       example1        linux       Succeeded  Commit     2020-11-20T23:16:07Z  00:00:40
cat       taskhelloworld  linux       Succeeded  Manual     2020-11-20T23:07:29Z  00:00:27

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 $ACR_NAME --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.

Run ID    TASK            PLATFORM    STATUS     TRIGGER       STARTED               DURATION
--------  --------------  ----------  ---------  ------------  --------------------  ----------
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
cav       example2        linux       Succeeded  Commit        2020-11-20T23:16:07Z  00:00:55
cau       example1        linux       Succeeded  Commit        2020-11-20T23:16:07Z  00:00:40
cat       taskhelloworld  linux       Succeeded  Manual        2020-11-20T23:07:29Z  00:00:27

Jeśli chcesz wykonać następujący opcjonalny krok uruchamiania nowo utworzonego kontenera, aby wyświetlić zaktualizowany numer wersji, zanotuj wartość IDENTYFIKATORA URUCHOMIENIA kompilacji wyzwalanej przez aktualizację obrazu (w poprzednich danych wyjściowych jest to "ca11").

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.

Aby uzyskać pełny przepływ pracy do zarządzania obrazami podstawowymi pochodzącymi ze źródła publicznego, zobacz How to consume and maintain public content with Azure Container Registry Tasks (Jak używać i obsługiwać zawartość publiczną przy użyciu zadań Azure Container Registry).

Teraz przejdź do następnego samouczka, aby dowiedzieć się, jak wyzwalać zadania zgodnie ze zdefiniowanym harmonogramem.