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. 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.
Wymagania wstępne
Konto usługi 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
Klonowanie rozwidlenia
Po utworzeniu rozwidlenia repozytorium sklonuj rozwidlenie, a następnie wprowadź katalog zawierający klon lokalny.
Sklonuj repozytorium przy użyciu polecenia git
i zastąp wartość <your-github-username> swoją nazwą użytkownika serwisu 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
Użyj środowiska powłoki Bash w usłudze Azure Cloud Shell. Aby uzyskać więcej informacji, zobacz Szybki start dotyczący powłoki Bash w usłudze Azure Cloud Shell.
Jeśli wolisz uruchamiać polecenia referencyjne interfejsu wiersza polecenia lokalnie, zainstaluj interfejs wiersza polecenia platformy Azure. Jeśli korzystasz z systemu Windows lub macOS, rozważ uruchomienie interfejsu wiersza polecenia platformy Azure w kontenerze Docker. Aby uzyskać więcej informacji, zobacz Jak uruchomić interfejs wiersza polecenia platformy Azure w kontenerze platformy Docker.
Jeśli korzystasz z instalacji lokalnej, zaloguj się do interfejsu wiersza polecenia platformy Azure za pomocą polecenia az login. Aby ukończyć proces uwierzytelniania, wykonaj kroki wyświetlane w terminalu. Aby uzyskać inne opcje logowania, zobacz Logowanie się przy użyciu interfejsu wiersza polecenia platformy Azure.
Po wyświetleniu monitu zainstaluj rozszerzenie interfejsu wiersza polecenia platformy Azure podczas pierwszego użycia. Aby uzyskać więcej informacji na temat rozszerzeń, zobacz Korzystanie z rozszerzeń w interfejsie wiersza polecenia platformy Azure.
Uruchom polecenie az version, aby znaleźć zainstalowane wersje i biblioteki zależne. Aby uaktualnić do najnowszej wersji, uruchom polecenie az upgrade.
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 element <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 kontenera podstawowego z usługi 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 korzystania z 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świetla 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.
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: