Udostępnij za pośrednictwem


Konfigurowanie obrazu kontenera do wykonywania wdrożeń za pomocą usługi ARM i Bicep

Z tego artykułu dowiesz się, jak tworzyć niestandardowe obrazy kontenerów usługi Azure Resource Manager (ARM) i Bicep w celu wdrożenia definicji środowiska w środowiskach wdrażania platformy Azure (ADE).

Definicja środowiska składa się z co najmniej dwóch plików: pliku szablonu, takiego jak azuredeploy.json lub main.bicep, oraz pliku manifestu o nazwie environment.yaml. Usługa ADE używa kontenerów do wdrażania definicji środowiska i natywnie obsługuje struktury ARM i Bicep IaC.

Model rozszerzalności programu ADE umożliwia tworzenie niestandardowych obrazów kontenerów do użycia z definicjami środowiska. Korzystając z modelu rozszerzalności, możesz utworzyć własne niestandardowe obrazy kontenerów i przechowywać je w rejestrze kontenerów, na przykład w usłudze DockerHub. Następnie możesz odwoływać się do tych obrazów w definicjach środowiska w celu wdrożenia środowisk.

Zespół usługi ADE oferuje wybór obrazów, które ułatwiają rozpoczęcie pracy, w tym obraz podstawowy oraz obraz usługi Azure Resource Manager (ARM)/Bicep. Dostęp do tych przykładowych obrazów można uzyskać w folderze Runner-Images .

Wymagania wstępne

Używanie obrazów kontenerów z usługą ADE

Możesz użyć jednego z następujących metod używania obrazów kontenerów z usługą ADE:

  • Użyj standardowego obrazu kontenera: w przypadku prostych scenariuszy użyj standardowego obrazu kontenera Bicep dostarczonego przez usługę ADE.
  • Tworzenie niestandardowego obrazu kontenera: w przypadku bardziej złożonych scenariuszy utwórz niestandardowy obraz kontenera spełniający określone wymagania.

Niezależnie od wybranego podejścia należy określić obraz kontenera w definicji środowiska, aby wdrożyć zasoby platformy Azure.

Używanie standardowego obrazu kontenera Bicep

Usługa ADE obsługuje natywnie Bicep, dzięki czemu można skonfigurować definicję środowiska, która wdraża zasoby platformy Azure dla środowiska wdrażania, dodając pliki szablonów (azuredeploy.json i environment.yaml) do katalogu. Usługa ADE używa następnie standardowego obrazu kontenera Bicep do utworzenia środowiska wdrażania.

W pliku environment.yaml właściwość modułu uruchamiającego określa lokalizację obrazu kontenera, którego chcesz użyć. Aby użyć przykładowego obrazu opublikowanego na Rejestr Artefaktów Microsoft, użyj odpowiedniego modułu uruchamiającego identyfikatory, jak pokazano w poniższej tabeli.

W poniższym przykładzie pokazano moduł uruchamiający, który odwołuje się do przykładowego obrazu kontenera Bicep:

    name: WebApp
    version: 1.0.0
    summary: Azure Web App Environment
    description: Deploys a web app in Azure without a datastore
    runner: Bicep
    templatePath: azuredeploy.json

Standardowy obraz kontenera Bicep można wyświetlić w repozytorium przykładowym usługi ADE w folderze Runner-Images dla obrazu ARM-Bicep .

Aby uzyskać więcej informacji na temat tworzenia definicji środowiska, które używają obrazów kontenera ADE do wdrażania zasobów platformy Azure, zobacz Dodawanie i konfigurowanie definicji środowiska.

Tworzenie niestandardowego obrazu kontenera Bicep

Utworzenie niestandardowego obrazu kontenera umożliwia dostosowanie wdrożeń do własnych wymagań. Obrazy niestandardowe można tworzyć na podstawie standardowych obrazów kontenerów usługi ADE.

Po zakończeniu dostosowywania obrazu należy skompilować obraz i wypchnąć go do rejestru kontenerów.

Tworzenie i dostosowywanie obrazu kontenera za pomocą platformy Docker

W tym przykładzie dowiesz się, jak utworzyć obraz platformy Docker w celu korzystania z wdrożeń usługi ADE i uzyskiwania dostępu do interfejsu wiersza polecenia programu ADE, korzystając z obrazu z jednego z obrazów utworzonych przez program ADE.

Interfejs wiersza polecenia programu ADE to narzędzie, które umożliwia tworzenie obrazów niestandardowych przy użyciu obrazów podstawowych programu ADE. Za pomocą interfejsu wiersza polecenia programu ADE można dostosować wdrożenia i usunięcia, aby dopasować je do przepływu pracy. Interfejs wiersza polecenia programu ADE jest wstępnie zainstalowany na przykładowych obrazach. Aby dowiedzieć się więcej na temat interfejsu wiersza polecenia programu ADE, zobacz dokumentację niestandardowego modułu uruchamiającego interfejs wiersza polecenia.

Aby utworzyć obraz skonfigurowany dla usługi ADE, wykonaj następujące kroki:

  1. Utwórz obraz na przykładowym obrazie utworzonym przez program ADE lub wybranym obrazie przy użyciu instrukcji FROM.
  2. Zainstaluj wszelkie niezbędne pakiety dla obrazu przy użyciu instrukcji RUN.
  3. Utwórz folder scripts na tym samym poziomie co plik Dockerfile, zapisz w nim pliki deploy.sh i delete.sh oraz upewnij się, że te skrypty są wykrywalne i wykonywalne w utworzonym kontenerze. Ten krok jest niezbędny do pracy wdrożenia przy użyciu obrazu podstawowego usługi ADE.

Wybieranie przykładowego obrazu kontenera przy użyciu instrukcji FROM

Dołącz instrukcję FROM w utworzonym pliku DockerFile dla nowego obrazu wskazującego przykładowy obraz hostowany na Rejestr Artefaktów Microsoft.

Oto przykładowa instrukcja FROM, odwołując się do przykładowego obrazu podstawowego:

FROM mcr.microsoft.com/deployment-environments/runners/core:latest

Ta instrukcja ściąga ostatnio opublikowany obraz podstawowy i sprawia, że stanowi podstawę dla niestandardowego obrazu.

Instalowanie aplikacji Bicep w pliku Dockerfile

Pakiet Bicep można zainstalować za pomocą interfejsu wiersza polecenia platformy Azure przy użyciu instrukcji RUN, jak pokazano w poniższym przykładzie:

RUN az bicep install

Przykładowe obrazy usługi ADE są oparte na obrazie interfejsu wiersza polecenia platformy Azure i mają wstępnie zainstalowane pakiety JQ i interfejsu wiersza polecenia programu ADE. Możesz dowiedzieć się więcej na temat interfejsu wiersza polecenia platformy Azure i pakietu JQ.

Aby zainstalować więcej pakietów potrzebnych na obrazie, użyj instrukcji RUN.

Wykonywanie skryptów powłoki operacji

W przykładowych obrazach operacje są określane i wykonywane na podstawie nazwy operacji. Obecnie dwie obsługiwane nazwy operacji są wdrażane i usuwane.

Aby skonfigurować obraz niestandardowy do korzystania z tej struktury, określ folder na poziomie pliku Dockerfile o nazwie scripts i określ dwa pliki, deploy.sh i delete.sh. Skrypt powłoki wdrażania jest uruchamiany po utworzeniu lub ponownym wdrożeniu środowiska, a skrypt powłoki usuwania jest uruchamiany po usunięciu środowiska. Przykłady skryptów powłoki można zobaczyć w repozytorium w folderze Runner-Images dla obrazu ARM-Bicep .

Aby upewnić się, że te skrypty powłoki są wykonywalne, dodaj następujące wiersze do pliku Dockerfile:

COPY scripts/* /scripts/
RUN find /scripts/ -type f -iname "*.sh" -exec dos2unix '{}' '+'
RUN find /scripts/ -type f -iname "*.sh" -exec chmod +x {} \;

Tworzenie skryptów powłoki operacji w celu wdrożenia szablonów usługi ARM lub Bicep

Aby upewnić się, że możesz pomyślnie wdrożyć infrastrukturę ARM lub Bicep za pośrednictwem usługi ADE, musisz:

  • Konwertowanie parametrów usługi ADE na dopuszczalne parametry usługi ARM
  • Rozwiązywanie problemów z połączonymi szablonami, jeśli są one używane we wdrożeniu
  • Używanie tożsamości zarządzanej uprzywilejowanej do wykonania wdrożenia

Podczas punktu wejścia obrazu podstawowego wszystkie parametry ustawione dla bieżącego środowiska są przechowywane w zmiennej $ADE_OPERATION_PARAMETERS. Aby przekonwertować je na dopuszczalne parametry arm, można uruchomić następujące polecenie przy użyciu JQ:

# format the parameters as arm parameters
deploymentParameters=$(echo "$ADE_OPERATION_PARAMETERS" | jq --compact-output '{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": (to_entries | if length == 0 then {} else (map( { (.key): { "value": .value } } ) | add) end) }' )

Następnie, aby rozwiązać wszystkie połączone szablony używane w szablonie opartym na formacie JSON usługi ARM, można dekompilować główny plik szablonu, który rozwiązuje wszystkie lokalne pliki infrastruktury używane w wielu modułach Bicep. Następnie ponownie skompiluj te moduły w jeden szablon usługi ARM z połączonymi szablonami osadzonymi w głównym szablonie usługi ARM jako szablony zagnieżdżone. Ten krok jest niezbędny tylko podczas operacji wdrażania. Główny plik szablonu można określić przy użyciu zestawu podczas punktu wejścia obrazu podstawowego i należy zresetować tę zmienną przy użyciu $ADE_TEMPLATE_FILE ponownie skompilowanego pliku szablonu. Zobacz poniższy przykład:

if [[ $ADE_TEMPLATE_FILE == *.json ]]; then

    hasRelativePath=$( cat $ADE_TEMPLATE_FILE | jq '[.. | objects | select(has("templateLink") and (.templateLink | has("relativePath")))] | any' )

    if [ "$hasRelativePath" = "true" ]; then
        echo "Resolving linked ARM templates"

        bicepTemplate="${ADE_TEMPLATE_FILE/.json/.bicep}"
        generatedTemplate="${ADE_TEMPLATE_FILE/.json/.generated.json}"

        az bicep decompile --file "$ADE_TEMPLATE_FILE"
        az bicep build --file "$bicepTemplate" --outfile "$generatedTemplate"

        # Correctly reassign ADE_TEMPLATE_FILE without the $ prefix during assignment
        ADE_TEMPLATE_FILE="$generatedTemplate"
    fi
fi

Aby zapewnić uprawnienia do wdrożenia wymaga wykonania wdrożenia i usunięcia zasobów w ramach subskrypcji, użyj tożsamości zarządzanej uprzywilejowanej skojarzonej z typem środowiska projektu ADE. Jeśli wdrożenie wymaga specjalnych uprawnień do ukończenia, takich jak określone role, przypisz te role do tożsamości typu środowiska projektu. Czasami tożsamość zarządzana nie jest natychmiast dostępna podczas wprowadzania kontenera; Możesz ponowić próbę, dopóki logowanie nie powiedzie się.

echo "Signing into Azure using MSI"
while true; do
    # managed identity isn't available immediately
    # we need to do retry after a short nap
    az login --identity --allow-no-subscriptions --only-show-errors --output none && {
        echo "Successfully signed into Azure"
        break
    } || sleep 5
done

Aby rozpocząć wdrażanie szablonów arm lub Bicep, uruchom az deployment group create polecenie . Podczas uruchamiania tego polecenia wewnątrz kontenera wybierz nazwę wdrożenia, która nie zastępuje żadnych poprzednich wdrożeń, i użyj --no-prompt true flag i --only-show-errors , aby upewnić się, że wdrożenie nie zakończy się niepowodzeniem na żadnych ostrzeżeniach lub zatrzymaniu w oczekiwaniu na dane wejściowe użytkownika, jak pokazano w poniższym przykładzie:

deploymentName=$(date +"%Y-%m-%d-%H%M%S")
az deployment group create --subscription $ADE_SUBSCRIPTION_ID \
    --resource-group "$ADE_RESOURCE_GROUP_NAME" \
    --name "$deploymentName" \
    --no-prompt true --no-wait \
    --template-file "$ADE_TEMPLATE_FILE" \
    --parameters "$deploymentParameters" \
    --only-show-errors

Aby usunąć środowisko, wykonaj wdrożenie w trybie pełnym i podaj pusty szablon usługi ARM, który usuwa wszystkie zasoby w określonej grupie zasobów programu ADE, jak pokazano w poniższym przykładzie:

deploymentName=$(date +"%Y-%m-%d-%H%M%S")
az deployment group create --resource-group "$ADE_RESOURCE_GROUP_NAME" \
    --name "$deploymentName" \
    --no-prompt true --no-wait --mode Complete \
    --only-show-errors \
    --template-file "$DIR/empty.json"

Stan aprowizacji i szczegóły można sprawdzić, uruchamiając poniższe polecenia. Usługa ADE używa niektórych specjalnych funkcji do odczytywania i udostępniania większego kontekstu na podstawie szczegółów aprowizacji, które można znaleźć w folderze Runner-Images . Prosta implementacja może być następująca:

if [ $? -eq 0 ]; then # deployment successfully created
    while true; do

        sleep 1

        ProvisioningState=$(az deployment group show --resource-group "$ADE_RESOURCE_GROUP_NAME" --name "$deploymentName" --query "properties.provisioningState" -o tsv)
        ProvisioningDetails=$(az deployment operation group list --resource-group "$ADE_RESOURCE_GROUP_NAME" --name "$deploymentName")

        echo "$ProvisioningDetails"

        if [[ "CANCELED|FAILED|SUCCEEDED" == *"${ProvisioningState^^}"* ]]; then

            echo -e "\nDeployment $deploymentName: $ProvisioningState"

            if [[ "CANCELED|FAILED" == *"${ProvisioningState^^}"* ]]; then
                exit 11
            else
                break
            fi
        fi
    done
fi

Na koniec, aby wyświetlić dane wyjściowe wdrożenia i przekazać je do usługi ADE, aby były dostępne za pośrednictwem interfejsu wiersza polecenia platformy Azure, możesz uruchomić następujące polecenia:

deploymentOutput=$(az deployment group show -g "$ADE_RESOURCE_GROUP_NAME" -n "$deploymentName" --query properties.outputs)
if [ -z "$deploymentOutput" ]; then
    deploymentOutput="{}"
fi
echo "{\"outputs\": $deploymentOutput}" > $ADE_OUTPUTS

Udostępnianie obrazu niestandardowego usłudze ADE

Musisz skompilować obraz platformy Docker i wypchnąć go do rejestru kontenerów, aby udostępnić go do użycia w usłudze ADE. Obraz można utworzyć przy użyciu interfejsu wiersza polecenia platformy Docker lub skryptu dostarczonego przez usługę ADE.

Wybierz odpowiednią kartę, aby dowiedzieć się więcej o każdym podejściu.

Przed skompilowanie obrazu, który ma zostać wypchnięty do rejestru, upewnij się, że aparat platformy Docker jest zainstalowany na komputerze. Następnie przejdź do katalogu pliku Dockerfile i uruchom następujące polecenie:

docker build . -t {YOUR_REGISTRY}.azurecr.io/{YOUR_REPOSITORY}:{YOUR_TAG}

Jeśli na przykład chcesz zapisać obraz w repozytorium w rejestrze o nazwie customImage, i przekazać go przy użyciu wersji tagu 1.0.0, uruchom następujące polecenie:

docker build . -t {YOUR_REGISTRY}.azurecr.io/customImage:1.0.0

Wypychanie obrazu platformy Docker do rejestru

Aby używać obrazów niestandardowych, należy skonfigurować publicznie dostępny rejestr obrazów z włączonym ściąganiem obrazu anonimowego. Dzięki temu środowiska wdrażania platformy Azure mogą uzyskiwać dostęp do niestandardowego obrazu do wykonania w naszym kontenerze.

Usługa Azure Container Registry to oferta platformy Azure, która przechowuje obrazy kontenerów i podobne artefakty.

Aby utworzyć rejestr, który można wykonać za pomocą interfejsu wiersza polecenia platformy Azure, witryny Azure Portal, poleceń programu PowerShell i nie tylko, postępuj zgodnie z jednym z przewodników Szybki start.

Aby skonfigurować rejestr w celu włączenia ściągania anonimowego obrazu, uruchom następujące polecenia w interfejsie wiersza polecenia platformy Azure:

az login
az acr login -n {YOUR_REGISTRY}
az acr update -n {YOUR_REGISTRY} --public-network-enabled true
az acr update -n {YOUR_REGISTRY} --anonymous-pull-enabled true

Gdy wszystko będzie gotowe do wypchnięcia obrazu do rejestru, uruchom następujące polecenie:

docker push {YOUR_REGISTRY}.azurecr.io/{YOUR_IMAGE_LOCATION}:{YOUR_TAG}

Łączenie obrazu z definicją środowiska

Podczas tworzenia definicji środowiska do używania obrazu niestandardowego we wdrożeniu edytuj runner właściwość w pliku manifestu (environment.yaml lub manifest.yaml).

runner: "{YOUR_REGISTRY}.azurecr.io/{YOUR_REPOSITORY}:{YOUR_TAG}"

Aby dowiedzieć się więcej na temat tworzenia definicji środowiska, które używają obrazów kontenera usługi ADE do wdrażania zasobów platformy Azure, zobacz Dodawanie i konfigurowanie definicji środowiska.

Uzyskiwanie dostępu do dzienników operacji i szczegółów błędu

Program ADE przechowuje szczegóły błędu dla nieudanego wdrożenia w pliku $ADE_ERROR_LOG w kontenerze.

Aby rozwiązać problemy z nieudanym wdrożeniem:

  1. Zaloguj się do portalu deweloperów.

  2. Zidentyfikuj środowisko, które nie powiodło się, i wybierz pozycję Zobacz szczegóły.

    Zrzut ekranu przedstawiający szczegóły błędu wdrażania, w szczególności nieprawidłową nazwę konta magazynu.

  3. Przejrzyj szczegóły błędu w sekcji Szczegóły błędu.

    Zrzut ekranu przedstawiający nieudane wdrożenie środowiska z wyświetlonym przyciskiem Zobacz szczegóły.

Ponadto możesz użyć interfejsu wiersza polecenia platformy Azure, aby wyświetlić szczegóły błędu środowiska przy użyciu następującego polecenia:

az devcenter dev environment show --environment-name {YOUR_ENVIRONMENT_NAME} --project {YOUR_PROJECT_NAME}

Aby wyświetlić dzienniki operacji wdrożenia lub usunięcia środowiska, użyj interfejsu wiersza polecenia platformy Azure, aby pobrać najnowszą operację dla środowiska, a następnie wyświetlić dzienniki dla tego identyfikatora operacji.

# Get list of operations on the environment, choose the latest operation
az devcenter dev environment list-operation --environment-name {YOUR_ENVIRONMENT_NAME} --project {YOUR_PROJECT_NAME}
# Using the latest operation ID, view the operation logs
az devcenter dev environment show-logs-by-operation --environment-name {YOUR_ENVIRONMENT_NAME} --project {YOUR_PROJECT_NAME} --operation-id {LATEST_OPERATION_ID}