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 gestione 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. Selezionare 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 le variabili della pipeline denominate webRepository e tag. Verranno usate 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 compilazione

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. Non ho avuto però la possibilità di vedere cosa possiamo usare per compilare l'immagine usando 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à. Aggiungiamola subito.

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. È leggermente diverso dalla distribuzione di una compilazione in Azure Pipelines, ma ancora sufficientemente diretto e può essere fatto con un'unica attività. Aggiungiamola subito.

App Web di Azure per attività Contenitore

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

  • appName: specifica il nome di un servizio di app Azure esistente.
  • azureSubscription: specifica il nome della sottoscrizione di Azure Resource Manager per la distribuzione.
  • imageName: specifica il nome completo dell'immagine del contenitore, myregistry.azurecr.io/nginx:latest ad esempio 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 Salva nell'angolo superiore destro 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 of Azure Pipelines showing the location of the website URL.

  4. Si dovrebbe vedere l'app Web in esecuzione in Servizio app.

    Screenshot of the Space Game website.

Andy: È un ottimo risultato L'adozione di contenitori è una grande opportunità per il team.