5
votes

I have a multi-container app running with App Service - Web App for Containers. It all works fine as long as the Docker Compose (Preview) configuration is provided under the Container Settings tab.

Currently, I am using Azure DevOps to create builds for specific containers, and then use the Continous Deployment option (in Azure Portal) under Container Settings to pull the latest deployed container image from ACR. This also works fine. I can run builds for individual containers, and deploy only specific container without affecting the web app. (Each container is a separate project, and only has a Dockerfile without requiring docker-compose)

However, when I create a Release from Azure DevOp using Azure App Service Deploy (version 4.*), the Docker Compose (Preview) configuration in Azure Portal is completely wiped out, and it defaults to Single Container and the application breaks. The Docker Compose configuration is needed as it makes the main container aware of the other containers.

I am using version 4.* of Azure App Service Deploy. I would like to use the Release feature of Azure DevOps as it provides more control.

Is there a way I can specify the docker-compose multi-container configuration from Azure App Service Deploy version 4 so that the App Service is aware of the multi-container configuration and not wipe out the multi-container config in Docker Compose (preview)

Thanks, Karan

2
Did you ever find a solution for this? Having similar issues with the app service deploy wiping items on the app service.Tom Studee
No, I did not find a solution. It was for a proof of concept, and we didn't go ahead after this ...Karan

2 Answers

3
votes

Replace the Azure App Service deploy task in your Release pipeline with an Azure Web App for Containers task. There are parameters for multiple images and a configuration file (Docker-Compose.yml).

1
votes

As Dave mentioned this is possible using the AzureWebAppContainer task, however the documentation does not mention the options regarding multi-container deployment.

I had to dig into the source code of that task to discover the task parameters.

https://github.com/microsoft/azure-pipelines-tasks/blob/master/Tasks/AzureWebAppContainerV1/taskparameters.ts

I'll summarise my setup to give you an idea how it can be used. I have a multi-stage pipeline defined in YAML. There are two stages, the first stage builds and publishes the Docker images and the second stage updates the Web App for Containers app service.

The first stage also produces an artifact, namely the docker-compose.yml file that is used to configure the Web App for Containers app service. In my repository I have a template for this file. During the pipeline execution the tags of the docker images are replaced within this template (e.g. using envsubst or sed). Then the resulting docker-compose.yml file is published as an artifact.

- task: PublishBuildArtifacts@1
  displayName: "Publish artifact"
  inputs:
    pathToPublish: $(Build.SourcesDirectory)/pipelines/assets/docker-compose.yml
    artifactName: yml

In the second stage of the pipeline the artifact is downloaded and used to configure the Web App for Containers. In the example below the AzureWebAppContainer is a step of a deployment job.

- task: AzureWebAppContainer@1
  displayName: 'Azure Web App for Containers'
  inputs:
    azureSubscription: '<YOUR_SUBSCRIPTION>'
    appName: '<YOUR_WEB_APP_FOR_CONTAINERS>'
    multicontainerConfigFile: $(System.ArtifactsDirectory)/yml/docker-compose.yml

The generated docker-compose.yml is stored as an artifact and you can always consult it later.