Esercizio - Distribuire un contenitore Docker in Azure

Completato

Il progetto è stato fornito con una pipeline di versione che compila i progetti nella soluzione e distribuisce l'app Web nel servizio app. È ora possibile aggiornare la compilazione della pipeline e distribuire il progetto come contenitore.

In questa unità si apprenderà come:

  • Definire alcune variabili della pipeline per semplificare la manutenzione della pipeline di compilazione.
  • Sostituire le attività di compilazione esistenti con un'attività unificata per compilare ed eseguire il push di un contenitore Docker.
  • Sostituire l'attività di distribuzione esistente con un'attività di aggiornamento dell'app Web del servizio app con la nuova immagine del contenitore.
  • Salvare la pipeline per attivare una compilazione e un rilascio.

Definire le variabili da condividere all'interno della pipeline

In questo caso si aggiungerà una nuova variabile di pipeline alla pipeline YAML esistente definita in azure-pipelines.yml.

  1. In Azure DevOps, passare a Pipelines.

  2. Selezionare la pipeline.

  3. Seleziona Modifica Assicurarsi che il ramo sia impostato su main selezionandolo dal menu a discesa. Verrà visualizzato il file azure-pipelines.yml .

  4. Aggiungere la riga evidenziata sotto per aggiungere variabili della pipeline denominate webRepository e tag. Questi verranno usati in più attività per identificare in modo univoco la versione specifica del contenitore a cui si fa riferimento. È anche possibile rimuovere la buildConfiguration variabile. Non sarà più necessaria.

    trigger:
    - '*'
    
    variables:
      buildConfiguration: 'Release'
      webRepository: 'web'
      tag: '$(Build.BuildId)'
    

Sostituire le attività della fase di build

Andy: Non credo che ci sia più bisogno di queste attività di compilazione, perché il Dockerfile nella cartella del progetto definisce già la compilazione desiderata. Tuttavia, non ho avuto la possibilità di vedere cosa possiamo usare per compilare l'immagine usando ancora un Dockerfile. Qualche idea?

Mara: Lo stavo giusto guardando. Sembra che sia possibile creare il contenitore e persino eseguirne il push nel repository con un'unica attività. Aggiungiamolo ora.

Attività Docker

È possibile usare l'attività Docker per compilare e distribuire immagini Docker. Sostituire l'intera fase di compilazione con il frammento YAML seguente.

  • command: specifica il comando Docker da eseguire.
  • buildContext: specifica il percorso del contesto di compilazione.
  • repository: specifica il nome del repository.
  • dockerfile: specifica il percorso del Dockerfile.
  • containerRegistry: specifica il nome della connessione al servizio registro Docker.
  • tags: specifica un elenco di tag in righe separate. Questi tag vengono usati nei comandi build, push e buildAndPush.
- stage: 'Build'
  displayName: 'Build and push'
  jobs:  
  - job: 'Build'
    displayName: 'Build job'
    pool:
      vmImage: 'ubuntu-20.04'
    steps:
    - task: Docker@2
      displayName: 'Build and push the image to container registry'
      inputs:
        command: buildAndPush
        buildContext: $(Build.Repository.LocalPath)
        repository: $(webRepository)
        dockerfile: '$(Build.SourcesDirectory)/Tailspin.SpaceGame.Web/Dockerfile'
        containerRegistry: 'Container Registry Connection'
        tags: |
          $(tag)

Sostituire l'attività della fase di distribuzione

Andy: Beh, sembra piuttosto semplice. Ora è sufficiente trovare un'attività che indichi al servizio app di usare la versione appena inserita dell'immagine del contenitore.

Mara: Ci sto già lavorando. È un po' diverso dal rilascio di una build su Azure Pipelines, ma ancora abbastanza semplice da poter eseguire l'operazione in un'unica attività. Aggiungiamolo ora.

App Web di Azure per attività Contenitore

L'attività Azure Web App per contenitori è progettata per distribuire contenitori Docker nel Servizio app di Azure. Sostituire l'intera fase di distribuzione con il frammento YAML seguente.

  • appName: specifica il nome di un servizio app di Azure esistente.
  • azureSubscription: specifica il nome della sottoscrizione di Azure Resource Manager per la distribuzione.
  • imageName: specifica il nome completo dell'immagine del contenitore; ad esempio, myregistry.azurecr.io/nginx:latest o python:3.7.2-alpine/.
- stage: 'Deploy'
  displayName: 'Deploy the container'
  dependsOn: Build
  jobs:
  - job: 'Deploy'
    displayName: 'Deploy job'
    pool:
      vmImage: 'ubuntu-20.04'
    variables:
    - group: Release
    steps:
    - task: AzureWebAppContainer@1
      inputs:
       appName: $(WebAppName)
       azureSubscription: 'Resource Manager - Tailspin - Space Game'
       imageName: $(RegistryName)/$(webRepository):$(build.buildId)

Salvare la pipeline per attivare una compilazione e il rilascio

  1. Selezionare Convalida e salva nell'angolo in alto a destra della pagina. Digitare il messaggio di commit e selezionare Salva per confermare.

  2. Selezionare Esegui e assicurarsi che il ramo sia impostato su main. Al termine, selezionare Esegui .

  3. Selezionare la pipeline per visualizzare i log. Dopo aver completato la compilazione, selezionare l'attività AzureWebAppContainer, quindi selezionare l'URL dell'applicazione del servizio app per visualizzare l'app Web distribuita.

    Screenshot di Azure Pipelines che mostra la posizione dell'URL del sito web.

  4. Dovresti vedere la tua app Web in esecuzione su App Service.

    Screenshot del sito Web Space Game.

Andy: è un ottimo risultato! Penso che l'adozione di contenitori potrebbe essere una vittoria enorme per il nostro team.