Distribuzioni di contenitori di App Service con Azure Developer CLI

Azure Developer CLI (azd) può distribuire l'app in Servizio app di Azure. Questa modalità di distribuzione esegue l'app come app Web Linux per contenitori. Quando un servizio usa host: appservice con una build basata su Docker, azd deploy compila l'immagine, la pubblica in Registro Azure Container (ACR) e indirizza un sito di App Service esistente alla nuova immagine.

Poiché azd deploy aggiorna solo il riferimento dell'immagine, la tua infrastruttura deve predisporre il sito per l'esecuzione in contenitore prima della distribuzione. Conoscere le aspettative di questa modalità di distribuzione consente di configurare correttamente il sito ed evitare distribuzioni non riuscite.

Questo articolo illustra il funzionamento della modalità di distribuzione, l'infrastruttura che deve essere già configurata e il modo in cui differisce dall'host containerapp . Presuppone che tu abbia familiarità con i progetti azd, azure.yaml, e i comandi di provisioning e distribuzione azd.

Come azd effettua il deployment di un contenitore in App Service

Quando un servizio viene impostato host: appservice con una configurazione del contenitore, azd deploy considera il sito di destinazione come app Web per contenitori ed esegue le operazioni seguenti:

  • Compila un'immagine del contenitore dal Dockerfile.
  • Carica l'immagine nell'istanza di Azure Container Registry (ACR) definita dalla tua infrastruttura.
  • Aggiorna l'impostazione linuxFxVersion del sito su DOCKER|<image> in modo che il sito esegua l'immagine.

azd deploy aggiorna solo il riferimento all'immagine per un sito esistente. Non crea o configura l'infrastruttura sottostante, quindi il sito deve essere già pronto per il contenitore prima della distribuzione.

Configurazione del servizio in azure.yaml

Una distribuzione di contenitori nel servizio app usa host: appservice con una compilazione basata su Docker. Impostare language: docker, o aggiungere una configurazione docker che punti al tuo Dockerfile:

services:
  web:
    project: ./src/web
    host: appservice
    language: docker
    docker:
      path: ./Dockerfile

Con questa configurazione, azd compila l'immagine da ./src/web/Dockerfile, lo inserisce nel registro e aggiorna il sito del servizio app per eseguire l'immagine. L'host appservice non applica le impostazioni env: a livello di servizio, quindi configura le impostazioni dell'app attraverso la tua infrastruttura.

Requisiti dell'infrastruttura per un sito di App Service abilitato per i contenitori

azd deploy non esegue il provisioning né modifica l'infrastruttura per l'host appservice, quindi il codice Bicep esistente o Terraform deve configurare il sito come app contenitore basata su Linux prima di eseguire la distribuzione. L'infrastruttura deve soddisfare il contratto seguente:

Requisito dettagli
Piano di servizio app Linux Il piano esegue Linux (kind: linux con reserved: true). Il servizio app supporta solo i contenitori in Linux, non Windows.
Sito pronto per i contenitori Il linuxFxVersion del sito utilizza un valore DOCKER\|. Un'immagine segnaposto è corretta, perché azd deploy la sostituisce con l'immagine che compila ed esegue il push.
Contenitore singolo Il sito esegue un container. L'host appservice non supporta configurazioni multi-contenitore o Docker Compose.
Accesso ad ACR tramite identità gestita Il sito si autentica ad ACR tramite un'identità gestita assegnata dall'utente, ad esempio acrUseManagedIdentityCreds: true con acrUserManagedIdentityID. L'host appservice non supporta le credenziali di amministratore.

Confronto tra azd deploy, provision e up

La distribuzione del contenitore in App Service comprende due ambiti, l'infrastruttura e il codice dell'applicazione, che corrispondono a diversi comandi azd:

Comando Funzionamento Quando usarlo
azd provision Crea e configura le risorse di Azure a partire da Bicep o Terraform, inclusi il sito di App Service predisposto per i contenitori e ACR. Usarlo quando l'infrastruttura cambia o il sito non esiste ancora.
azd deploy Crea l'immagine, la carica in ACR e aggiorna il riferimento dell'immagine del sito. Non tocca l'infrastruttura. Usarlo per spedire le modifiche dell'applicazione a un sito di cui è già stato effettuato il provisioning.
azd up Viene eseguito azd provision e quindi azd deploy in un singolo comando. Usare questa opzione per una prima distribuzione o quando si desidera effettuare il provisioning e la distribuzione contemporaneamente.

Poiché azd deploy aggiorna solo il riferimento all'immagine, una appservice distribuzione del contenitore dipende sempre dall'infrastruttura precedente azd provision o azd up creata.

Convalida dell'idoneità per la distribuzione

Prima di aggiornare il sito, azd deploy verifica che il sito di destinazione sia pronto per il contenitore. Se il sito non è un'app contenitore Linux, ad esempio usa un piano Windows, non include un valore DOCKER|linuxFxVersion o non dispone dell'accesso all'identità gestita per ACR, allora azd deploy si arresta e restituisce un errore che identifica la configurazione mancante. Correggi l'infrastruttura ed esegui di nuovo il provisioning prima di effettuare nuovamente la distribuzione.

Contenitori di App Service a confronto con Container Apps

Sia gli host containerapp che appservice distribuiscono immagini di contenitori, ma gestiscono l'infrastruttura e la configurazione in modo diverso:

Behavior appservice host containerapp host
Configurazione dell'infrastruttura azd deploy aggiorna solo il riferimento all'immagine e presuppone che il sito sia già predisposto per l'uso di container. Esegue il provisioning e configura una parte maggiore del runtime del container.
Variabili di ambiente Non applica le impostazioni a livello env: di servizio. Configurare invece le impostazioni dell'app tramite l'infrastruttura. Applica le impostazioni a livello env: di servizio al contenitore.
Supporto poliglotta Containerizza le app in qualsiasi linguaggio tramite language: docker, utile per i runtime senza supporto predefinito azd . Containerizza le app in qualsiasi linguaggio tramite language: docker, utile per i runtime senza supporto predefinito azd .