Samouczek: Kompilowanie obrazów kontenera w chmurze przy użyciu zadań usługi Azure Container Registry

Usługa ACR Tasks to pakiet funkcji usługi Azure Container Registry, który udostępnia udoskonalone i wydajne kompilacje obrazów kontenerów platformy Docker na platformie Azure. Z tego artykułu dowiesz się, jak używać funkcji szybkiego zadania usługi ACR Tasks.

Cykl tworzenia oprogramowania „pętli wewnętrznej” to iteracyjny proces pisania kodu, kompilowania i testowania aplikacji przed zaewidencjonowaniem w kontroli źródła. Szybkie zadanie rozszerza pętlę wewnętrzną na chmurę, udostępniając funkcję walidacji powodzenia kompilacji i automatyczne wypychanie pomyślnie skompilowanych obrazów do rejestru kontenerów. Obrazy są wbudowane natywnie w chmurze, blisko rejestru, co umożliwia szybsze wdrażanie.

Całe środowisko pracy z plikami Dockerfile jest przenoszone bezpośrednio do usługi ACR Tasks. Nie trzeba zmieniać plików Dockerfile w celu przeprowadzania kompilacji w chmurze przy użyciu usługi ACR Tasks, wystarczy zmienić uruchamiane polecenie.

W tym samouczku, będącym pierwszą częścią serii, zostaną wykonane następujące czynności:

  • Pobieranie kodu źródłowego przykładowej aplikacji
  • Kompilowanie obrazu kontenera na platformie Azure
  • Wdrażanie kontenera w usłudze Azure Container Instances

Z kolejnych samouczków dowiesz się, jak używać zadań usługi ACR Tasks na potrzeby automatycznych kompilacji obrazu kontenera podczas zatwierdzania kodu i aktualizacji obrazu podstawowego. 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.

Wymagania wstępne

Konto w serwisie GitHub

Utworzenie konta usługi https://github.com, jeśli jeszcze go nie masz. W tym samouczku do zademonstrowania zautomatyzowanych kompilacji obrazu w usłudze ACR Tasks jest używane repozytorium GitHub.

Tworzenie rozwidlenia przykładowego repozytorium

Następnie należy użyć interfejsu użytkownika serwisu GitHub do utworzenia rozwidlenia przykładowego repozytorium na koncie usługi GitHub. W tym samouczku utworzysz obraz kontenera na podstawie źródła w repozytorium, a w następnym samouczku wypchniesz zatwierdzenie do rozwidlenia repozytorium, aby uruchomić automatyczne zadanie.

Utwórz rozwidlenie tego repozytorium: https://github.com/Azure-Samples/acr-build-helloworld-node

Zrzut ekranu przedstawiający przycisk rozwidlenia (wyróżniony) w serwisie GitHub

Klonowanie rozwidlenia

Po utworzeniu rozwidlenia repozytorium sklonuj rozwidlenie, a następnie wprowadź katalog zawierający klon lokalny.

Sklonuj repozytorium za pomocą polecenia , zastąp gitciąg< your-github-username> nazwą użytkownika usługi GitHub:

git clone https://github.com/<your-github-username>/acr-build-helloworld-node

Wprowadź katalog zawierający kod źródłowy:

cd acr-build-helloworld-node

Powłoka programu Bash

Polecenia w tym samouczku zostały sformatowane pod kątem powłoki programu Bash. Jeśli wolisz używać programu PowerShell, wiersza polecenia lub innej powłoki, konieczne może być odpowiednie dostosowanie kontynuacji wiersza i formatu zmiennych środowiskowych.

Przygotowywanie środowiska dla interfejsu wiersza polecenia platformy Azure

Kompilowanie na platformie Azure przy użyciu usługi ACR Tasks

Teraz, gdy kod źródłowy został pobrany do komputera, wykonaj następujące kroki, aby utworzyć rejestr kontenerów i skompilować obraz kontenera przy użyciu usługi ACR Tasks.

Aby wykonywanie przykładowych poleceń było łatwiejsze, w tej serii samouczków używaj zmiennych środowiskowych powłoki. Uruchom następujące polecenie, aby ustawić zmienną ACR_NAME. Zastąp <ciąg registry-name> unikatową nazwą nowego rejestru kontenerów. Nazwa rejestru musi być unikatowa na platformie Azure, zawierać tylko małe litery i zawierać od 5 do 50 znaków alfanumerycznych. Inne zasoby tworzone w tym samouczku opierają się na tej nazwie, dlatego konieczne powinno być zmodyfikowanie tylko tej pierwszej zmiennej.

ACR_NAME=<registry-name>

Po wypełnieniu zmiennej środowiskowej rejestru kontenerów teraz powinno być możliwe skopiowanie i wklejenie pozostałej części poleceń w samouczku bez edytowania wartości. Wykonaj następujące polecenia, aby utworzyć grupę zasobów i rejestr kontenerów.

RES_GROUP=$ACR_NAME # Resource Group name

az group create --resource-group $RES_GROUP --location eastus
az acr create --resource-group $RES_GROUP --name $ACR_NAME --sku Standard --location eastus

Teraz, gdy masz rejestr, użyj usługi ACR Tasks do skompilowania obrazu kontenera na podstawie kodu przykładowego. Wykonaj polecenie az acr build , aby wykonać szybkie zadanie.

Uwaga

Plik Dockerfile używany w poniższym przykładzie zależy od publicznego obrazu podstawowego kontenera z Docker Hub. Aby zwiększyć niezawodność podczas korzystania z zawartości publicznej, zaimportuj obraz i zarządzaj nim w prywatnym rejestrze kontenerów platformy Azure, a następnie zaktualizuj plik Dockerfile do używania obrazu podstawowego zarządzanego prywatnie. Dowiedz się więcej o pracy z obrazami publicznymi.

az acr build --registry $ACR_NAME --image helloacrtasks:v1 --file /path/to/Dockerfile /path/to/build/context.

Dane wyjściowe polecenia az acr build są podobne do poniższych. Możesz wyświetlić przekazany kod źródłowy („kontekst”) na platformie Azure i szczegóły operacji docker build, którą usługa ACR Tasks uruchamia w chmurze. Ponieważ usługa ACR Tasks używa polecenia docker build do kompilowania obrazów, do natychmiastowego rozpoczęcia pracy z usługą ACR Tasks nie są wymagane żadne zmiany plików Dockerfile.

Packing source code into tar file to upload...
Sending build context (4.813 KiB) to ACR...
Queued a build with build ID: da1
Waiting for build agent...
2020/11/18 18:31:42 Using acb_vol_01185991-be5f-42f0-9403-a36bb997ff35 as the home volume
2020/11/18 18:31:42 Setting up Docker configuration...
2020/11/18 18:31:43 Successfully set up Docker configuration
2020/11/18 18:31:43 Logging in to registry: myregistry.azurecr.io
2020/11/18 18:31:55 Successfully logged in
Sending build context to Docker daemon   21.5kB
Step 1/5 : FROM node:15-alpine
15-alpine: Pulling from library/node
Digest: sha256:8dafc0968fb4d62834d9b826d85a8feecc69bd72cd51723c62c7db67c6dec6fa
Status: Image is up to date for node:15-alpine
 ---> a56170f59699
Step 2/5 : COPY . /src
 ---> 88087d7e709a
Step 3/5 : RUN cd /src && npm install
 ---> Running in e80e1263ce9a
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN helloworld@1.0.0 No repository field.

up to date in 0.1s
Removing intermediate container e80e1263ce9a
 ---> 26aac291c02e
Step 4/5 : EXPOSE 80
 ---> Running in 318fb4c124ac
Removing intermediate container 318fb4c124ac
 ---> 113e157d0d5a
Step 5/5 : CMD ["node", "/src/server.js"]
 ---> Running in fe7027a11787
Removing intermediate container fe7027a11787
 ---> 20a27b90eb29
Successfully built 20a27b90eb29
Successfully tagged myregistry.azurecr.io/helloacrtasks:v1
2020/11/18 18:32:11 Pushing image: myregistry.azurecr.io/helloacrtasks:v1, attempt 1
The push refers to repository [myregistry.azurecr.io/helloacrtasks]
6428a18b7034: Preparing
c44b9827df52: Preparing
172ed8ca5e43: Preparing
8c9992f4e5dd: Preparing
8dfad2055603: Preparing
c44b9827df52: Pushed
172ed8ca5e43: Pushed
8dfad2055603: Pushed
6428a18b7034: Pushed
8c9992f4e5dd: Pushed
v1: digest: sha256:b038dcaa72b2889f56deaff7fa675f58c7c666041584f706c783a3958c4ac8d1 size: 1366
2020/11/18 18:32:43 Successfully pushed image: myregistry.azurecr.io/helloacrtasks:v1
2020/11/18 18:32:43 Step ID acb_step_0 marked as successful (elapsed time in seconds: 15.648945)
The following dependencies were found:
- image:
    registry: myregistry.azurecr.io
    repository: helloacrtasks
    tag: v1
    digest: sha256:b038dcaa72b2889f56deaff7fa675f58c7c666041584f706c783a3958c4ac8d1
  runtime-dependency:
    registry: registry.hub.docker.com
    repository: library/node
    tag: 15-alpine
    digest: sha256:8dafc0968fb4d62834d9b826d85a8feecc69bd72cd51723c62c7db67c6dec6fa
  git: {}

Run ID: da1 was successful after 1m9.970148252s

Pod koniec danych wyjściowych usługa ACR Tasks wyświetla odnalezione zależności obrazu. Umożliwia to usłudze ACR Tasks automatyzowanie kompilacji obrazu podczas aktualizacji obrazu podstawowego, na przykład gdy obraz podstawowy jest aktualizowany przy użyciu poprawek systemu operacyjnego lub platformy. Obsługa aktualizacji obrazu podstawowego w usłudze ACR Tasks została omówiona w dalszej części tej serii samouczków.

Wdrażanie w usłudze Azure Container Instances

Usługa ACR Tasks domyślnie automatycznie wypycha pomyślnie skompilowane obrazy do rejestru, dzięki czemu można natychmiast wdrożyć je z rejestru.

W tej sekcji utworzysz magazyn Azure Key Vault i jednostkę usługi, a następnie wdrożysz kontener w usłudze Azure Container Instances (ACI) przy użyciu poświadczeń jednostki usługi.

Konfigurowanie uwierzytelniania rejestru

Wszystkie scenariusze produkcyjne powinny używać jednostek usługi do uzyskiwania dostępu do rejestru kontenerów platformy Azure. Jednostki usługi umożliwiają sprawowanie kontroli dostępu opartej na rolach nad obrazami kontenera. Na przykład można skonfigurować jednostkę usługi z dostępem tylko do ściągania do rejestru.

Tworzenie magazynu kluczy

Jeśli nie masz jeszcze magazynu w usłudze Azure Key Vault, utwórz go przy użyciu interfejsu wiersza polecenia platformy Azure przy użyciu poniższych poleceń.

AKV_NAME=$ACR_NAME-vault

az keyvault create --resource-group $RES_GROUP --name $AKV_NAME

Tworzenie jednostki usługi i przechowywanie poświadczeń

Musisz teraz utworzyć jednostkę usługi i przechowywać jej poświadczenia w magazynie kluczy.

Użyj polecenia az ad sp create-for-rbac , aby utworzyć jednostkę usługi i az keyvault secret set do przechowywania hasła jednostki usługi w magazynie. Użyj interfejsu wiersza polecenia platformy Azure w wersji 2.25.0 lub nowszej dla następujących poleceń:

# Create service principal, store its password in AKV (the registry *password*)
az keyvault secret set \
  --vault-name $AKV_NAME \
  --name $ACR_NAME-pull-pwd \
  --value $(az ad sp create-for-rbac \
                --name $ACR_NAME-pull \
                --scopes $(az acr show --name $ACR_NAME --query id --output tsv) \
                --role acrpull \
                --query password \
                --output tsv)

Argument --role w poprzednim poleceniu konfiguruje jednostkę usługi z rolą acrpull, co spowoduje przyznanie dostępu tylko do ściągania do rejestru. Aby przyznać prawa dostępu do wypychania i ściągania, należy zmienić argument --role na wartość acrpush.

Następnie przechowuj jednostkę usługi appId w magazynie. Jest to nazwa użytkownika przekazywana do usługi Azure Container Registry na potrzeby uwierzytelniania:

# Store service principal ID in AKV (the registry *username*)
az keyvault secret set \
    --vault-name $AKV_NAME \
    --name $ACR_NAME-pull-usr \
    --value $(az ad sp list --display-name $ACR_NAME-pull --query [].appId --output tsv)

Utworzono magazyn Azure Key Vault, w którym są przechowywane dwa wpisy tajne:

  • $ACR_NAME-pull-usr: identyfikator jednostki usługi do użycia jako nazwa użytkownika rejestru kontenerów.
  • $ACR_NAME-pull-pwd: hasło jednostki usługi do użycia jako hasło rejestru kontenerów.

Teraz możesz odwoływać się do tych wpisów tajnych według nazwy, gdy Ty lub Twoje aplikacje i usługi ściągają obrazy z rejestru.

Wdrażanie kontenera przy użyciu interfejsu wiersza polecenia platformy Azure

Teraz, gdy poświadczenia główne są przechowywane jako wpisy tajne usługi Azure Key Vault, aplikacje i usługi mogą używać ich do uzyskiwania dostępu do rejestru prywatnego.

Wykonaj polecenie az container create w celu wdrożenia wystąpienia kontenera. Polecenie używa poświadczeń jednostki usługi przechowywanych w usłudze Azure Key Vault do uwierzytelniania rejestru kontenerów.

az container create \
    --resource-group $RES_GROUP \
    --name acr-tasks \
    --image $ACR_NAME.azurecr.io/helloacrtasks:v1 \
    --registry-login-server $ACR_NAME.azurecr.io \
    --registry-username $(az keyvault secret show --vault-name $AKV_NAME --name $ACR_NAME-pull-usr --query value -o tsv) \
    --registry-password $(az keyvault secret show --vault-name $AKV_NAME --name $ACR_NAME-pull-pwd --query value -o tsv) \
    --dns-name-label acr-tasks-$ACR_NAME \
    --query "{FQDN:ipAddress.fqdn}" \
    --output table

Wartość --dns-name-label musi być unikatowa na platformie Azure, dlatego poprzednie polecenie dołącza nazwę rejestru kontenerów do etykiety nazwy DNS kontenera. Dane wyjściowe polecenia wyświetlają w pełni kwalifikowaną nazwę domeny (FQDN) kontenera, na przykład:

FQDN
----------------------------------------------
acr-tasks-myregistry.eastus.azurecontainer.io

Zanotuj nazwę FQDN kontenera. Będzie ona używana w następnej sekcji.

Weryfikowanie wdrożenia

Aby obejrzeć proces uruchamiania kontenera, użyj polecenia az container attach:

az container attach --resource-group $RES_GROUP --name acr-tasks

Dane az container attach wyjściowe najpierw wyświetlają stan kontenera podczas ściągania obrazu i uruchamiania, a następnie wiąże stDOUT i STDERR konsoli lokalnej z kontenerem.

Container 'acr-tasks' is in state 'Running'...
(count: 1) (last timestamp: 2020-11-18 18:39:10+00:00) pulling image "myregistry.azurecr.io/helloacrtasks:v1"
(count: 1) (last timestamp: 2020-11-18 18:39:15+00:00) Successfully pulled image "myregistry.azurecr.io/helloacrtasks:v1"
(count: 1) (last timestamp: 2020-11-18 18:39:17+00:00) Created container
(count: 1) (last timestamp: 2020-11-18 18:39:17+00:00) Started container

Start streaming logs:
Server running at http://localhost:80

Po wyświetleniu elementu Server running at http://localhost:80 przejdź do nazwy FQDN kontenera w przeglądarce, aby zobaczyć działającą aplikację. Nazwa FQDN powinna zostać wyświetlona w danych wyjściowych polecenia az container create, które zostało wykonane w poprzedniej sekcji.

Przykładowa aplikacja uruchomiona w przeglądarce

Aby odłączyć konsolę od kontenera, wybierz pozycję Control+C.

Czyszczenie zasobów

Zatrzymaj wystąpienie kontenera przy użyciu polecenia az container delete:

az container delete --resource-group $RES_GROUP --name acr-tasks

Aby usunąć wszystkie zasoby, które zostały utworzone w tej serii samouczków, w tym rejestr kontenerów, wystąpienie kontenera, magazyn kluczy i jednostkę usługi, należy zastosować poniższe polecenia. Te zasoby są jednak używane w następnym samouczku w serii, więc warto je zachować w przypadku bezpośredniego przechodzenia do następnego samouczka.

az group delete --resource-group $RES_GROUP
az ad sp delete --id http://$ACR_NAME-pull

Następne kroki

Teraz, po przetestowaniu pętli wewnętrznej przy użyciu szybkiego zadania, skonfiguruj zadanie kompilacji w celu wyzwolenia kompilacji obrazów kontenera podczas zatwierdzania kodu źródłowego w repozytorium usługi Git: