Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions .github/workflows/deploy_to_aca.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ jobs:
with:
subscriptionId: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
resourceGroupName: ${{ env.RESOURCE_GROUP }}
template: azd/aci/modules//acr.bicep
template: azd/aca/modules/acr.bicep
parameters: "registryName=${{ env.AZURE_CONTAINER_REGISTRY }}"
failOnStdErr: false

Expand All @@ -55,11 +55,12 @@ jobs:
with:
subscriptionId: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
resourceGroupName: ${{ env.RESOURCE_GROUP }}
template: IaC/aca.bicep
template: azd/aca/modules/aca.bicep
parameters: >
containerAppName=${{ env.ACA_NAME }}
acrName=${{ env.AZURE_CONTAINER_REGISTRY }}
imageName=${{ env.CONTAINER_NAME }}
containerPort=8080
failOnStdErr: false

# Get Container App URL for output
Expand Down
5 changes: 3 additions & 2 deletions .github/workflows/deploy_to_aci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ jobs:
with:
subscriptionId: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
resourceGroupName: ${{ env.RESOURCE_GROUP }}
template: azd/aci/modules/acr.bicep
template: azd/acr/modules/acr.bicep
parameters: "registryName=${{ env.AZURE_CONTAINER_REGISTRY }}"
failOnStdErr: false

Expand All @@ -53,11 +53,12 @@ jobs:
with:
subscriptionId: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
resourceGroupName: ${{ env.RESOURCE_GROUP }}
template: IaC/aci.bicep
template: azd/aci/modules/aci.bicep
parameters: >
containerInstanceName=${{ env.ACI_NAME }}
acrName=${{ env.AZURE_CONTAINER_REGISTRY }}
imageName=${{ env.CONTAINER_NAME }}
containerPort=8080
failOnStdErr: false

# Get ACI IP address for output
Expand Down
7 changes: 4 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
FROM mcr.microsoft.com/dotnet/sdk:6.0 as build-env
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
WORKDIR /src
COPY src/*.csproj .
RUN dotnet restore
COPY src .
RUN dotnet publish -c Release -o /publish

FROM mcr.microsoft.com/dotnet/aspnet:6.0 as runtime
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
WORKDIR /publish
COPY --from=build-env /publish .
EXPOSE 80
ENV ASPNETCORE_HTTP_PORTS=8080
EXPOSE 8080
ENTRYPOINT ["dotnet", "docker-app.dll"]
34 changes: 19 additions & 15 deletions azd/aca/infra.bicep
Original file line number Diff line number Diff line change
Expand Up @@ -9,43 +9,47 @@ param environmentName string
@description('Primary location for all resources')
param location string

@description('The container image name to deploy')
param imageName string = 'docker-app'

@description('Port the container listens on')
param containerPort int = 8080

var resourceToken = toLower(uniqueString(subscription().id, environmentName, location))
var tags = { 'azd-env-name': environmentName }
var containerAppName = 'aca-${resourceToken}'
var registryName = 'acr${resourceToken}'

resource resourceGroup 'Microsoft.Resources/resourceGroups@2021-04-01' = {
name: 'rg-${environmentName}'
location: location
tags: tags
}

module containerRegistry 'modules/container-registry.bicep' = {
module containerRegistry 'modules/acr.bicep' = {
name: 'registry'
scope: resourceGroup
params: {
location: location
tags: tags
name: 'acr${resourceToken}'
registryName: registryName
sku: 'Basic'
addAdminUser: true
}
}

module containerInstance 'modules/container-instance.bicep' = {
name: 'container-instance'
module containerApp 'modules/aca.bicep' = {
name: 'container-app'
scope: resourceGroup
params: {
location: location
tags: tags
name: 'aci-${resourceToken}'
containerImage: '${containerRegistry.outputs.loginServer}/docker-app:latest'
containerPort: 80
cpuCores: '1.0'
memoryInGb: '1.5'
registryLoginServer: containerRegistry.outputs.loginServer
registryUsername: containerRegistry.outputs.adminUsername
registryPassword: containerRegistry.outputs.adminPassword
containerAppName: containerAppName
acrName: containerRegistry.outputs.name
imageName: imageName
containerPort: containerPort
}
}

output AZURE_LOCATION string = location
output AZURE_CONTAINER_REGISTRY_ENDPOINT string = containerRegistry.outputs.loginServer
output AZURE_CONTAINER_REGISTRY_NAME string = containerRegistry.outputs.name
output ACI_URI string = containerInstance.outputs.uri
output ACA_URL string = containerApp.outputs.containerAppUrl
33 changes: 12 additions & 21 deletions azd/aca/main.bicep
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,16 @@ param environmentName string
@description('Primary location for all resources')
param location string

@description('The container image to deploy')
param containerImage string = ''
@description('The container image name to deploy')
param imageName string = 'docker-app'

@description('Port the container listens on')
param containerPort int = 80

@description('CPU cores allocated to the container instance')
param cpuCores string = '1.0'

@description('Memory allocated to the container instance in GB')
param memoryInGb string = '1.5'
param containerPort int = 8080

var resourceToken = toLower(uniqueString(subscription().id, environmentName, location))
var tags = { 'azd-env-name': environmentName }
var containerAppName = 'aca-${resourceToken}'
var registryName = 'acr${resourceToken}'

resource resourceGroup 'Microsoft.Resources/resourceGroups@2021-04-01' = {
name: 'rg-${environmentName}'
Expand All @@ -35,30 +31,25 @@ module containerRegistry './modules/acr.bicep' = {
scope: resourceGroup
params: {
location: location
registryName: 'acr${resourceToken}'
registryName: registryName
sku: 'Basic'
addAdminUser: true
}
}

module containerInstance './modules/container-instance.bicep' = {
name: 'container-instance'
module containerApp './modules/aca.bicep' = {
name: 'container-app'
scope: resourceGroup
params: {
location: location
tags: tags
name: 'aci-${resourceToken}'
containerImage: !empty(containerImage) ? containerImage : 'mcr.microsoft.com/azuredocs/aci-helloworld'
containerAppName: containerAppName
acrName: containerRegistry.outputs.name
imageName: imageName
containerPort: containerPort
cpuCores: cpuCores
memoryInGb: memoryInGb
registryLoginServer: containerRegistry.outputs.loginServer
registryUsername: containerRegistry.outputs.adminUsername
registryPassword: containerRegistry.outputs.adminPassword
}
}

output AZURE_LOCATION string = location
output AZURE_CONTAINER_REGISTRY_ENDPOINT string = containerRegistry.outputs.loginServer
output AZURE_CONTAINER_REGISTRY_NAME string = containerRegistry.outputs.name
output ACI_URI string = containerInstance.outputs.uri
output ACA_URL string = containerApp.outputs.containerAppUrl
20 changes: 7 additions & 13 deletions azd/aca/modules/aca.bicep
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ param containerAppName string
param location string = resourceGroup().location
param acrName string
param imageName string
param containerPort int = 80
param containerPort int = 8080
param minReplicas int = 1
param maxReplicas int = 3
param cpu string = '0.5'
Expand All @@ -12,25 +12,19 @@ param memory string = '1Gi'
var environmentName = '${containerAppName}-env'

// Reference to existing ACR
resource acr 'Microsoft.ContainerRegistry/registries@2021-06-01-preview' existing = {
resource acr 'Microsoft.ContainerRegistry/registries@2023-07-01' existing = {
name: acrName
}

// Container App Environment
resource environment 'Microsoft.App/managedEnvironments@2022-10-01' = {
resource environment 'Microsoft.App/managedEnvironments@2023-05-01' = {
name: environmentName
location: location
properties: {}
}

// Get the ACR admin credentials
resource acrCredentials 'Microsoft.ContainerRegistry/registries/listCredentials@2021-06-01-preview' = {
parent: acr
name: 'default'
}

// Container App
resource containerApp 'Microsoft.App/containerApps@2022-10-01' = {
resource containerApp 'Microsoft.App/containerApps@2023-05-01' = {
name: containerAppName
location: location
properties: {
Expand All @@ -50,14 +44,14 @@ resource containerApp 'Microsoft.App/containerApps@2022-10-01' = {
registries: [
{
server: acr.properties.loginServer
username: acrCredentials.username
username: acr.listCredentials().username
passwordSecretRef: 'registry-password'
}
]
secrets: [
{
name: 'registry-password'
value: acrCredentials.passwords[0].value
value: acr.listCredentials().passwords[0].value
}
]
}
Expand All @@ -67,7 +61,7 @@ resource containerApp 'Microsoft.App/containerApps@2022-10-01' = {
name: containerAppName
image: '${acr.properties.loginServer}/${imageName}:latest'
resources: {
cpu: cpu
cpu: json(cpu)
memory: memory
}
}
Expand Down
9 changes: 7 additions & 2 deletions azd/aca/modules/acr.bicep
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ param location string = resourceGroup().location
param sku string = 'Basic'
param addAdminUser bool = true

resource acr 'Microsoft.ContainerRegistry/registries@2021-06-01-preview' = {
resource acr 'Microsoft.ContainerRegistry/registries@2023-07-01' = {
name: registryName
location: location
sku: {
Expand All @@ -15,7 +15,12 @@ resource acr 'Microsoft.ContainerRegistry/registries@2021-06-01-preview' = {
}
}

// Outputs for linking to AKS
// Outputs for linking to AKS and other services
output acrId string = acr.id
output acrName string = acr.name
output acrLoginServer string = acr.properties.loginServer
// Alias outputs used by ACI/ACA modules
output name string = acr.name
output loginServer string = acr.properties.loginServer
output adminUsername string = acr.listCredentials().username
output adminPassword string = acr.listCredentials().passwords[0].value
10 changes: 5 additions & 5 deletions azd/aci/infra.bicep
Original file line number Diff line number Diff line change
Expand Up @@ -37,16 +37,16 @@ module containerInstance 'modules/container-instance.bicep' = {
tags: tags
name: 'aci-${resourceToken}'
containerImage: '${containerRegistry.outputs.acrLoginServer}/docker-app:latest'
containerPort: 80
containerPort: 8080
cpuCores: '1.0'
memoryInGb: '1.5'
registryLoginServer: containerRegistry.outputs.acrLoginServer
registryUsername: containerRegistry.outputs.acrName
registryPassword: containerRegistry.outputs.acrPassword
registryUsername: containerRegistry.outputs.adminUsername
registryPassword: containerRegistry.outputs.adminPassword
}
}

output AZURE_LOCATION string = location
output AZURE_CONTAINER_REGISTRY_ENDPOINT string = containerRegistry.outputs.loginServer
output AZURE_CONTAINER_REGISTRY_NAME string = containerRegistry.outputs.name
output AZURE_CONTAINER_REGISTRY_ENDPOINT string = containerRegistry.outputs.acrLoginServer
output AZURE_CONTAINER_REGISTRY_NAME string = containerRegistry.outputs.acrName
output ACI_URI string = containerInstance.outputs.uri
2 changes: 1 addition & 1 deletion azd/aci/main.bicep
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ param location string
param containerImage string = ''

@description('Port the container listens on')
param containerPort int = 80
param containerPort int = 8080

@description('CPU cores allocated to the container instance')
param cpuCores string = '1.0'
Expand Down
18 changes: 6 additions & 12 deletions azd/aci/modules/aci.bicep
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,16 @@ param containerInstanceName string
param location string = resourceGroup().location
param acrName string
param imageName string
param containerPort int = 80
param containerPort int = 8080
param cpuCores string = '1.0'
param memoryInGb string = '1.5'
param restartPolicy string = 'Always'

resource acr 'Microsoft.ContainerRegistry/registries@2021-06-01-preview' existing = {
resource acr 'Microsoft.ContainerRegistry/registries@2023-07-01' existing = {
name: acrName
}

// Get the ACR admin credentials
resource acrCredentials 'Microsoft.ContainerRegistry/registries/listCredentials@2021-06-01-preview' = {
parent: acr
name: 'default'
}

resource containerGroup 'Microsoft.ContainerInstance/containerGroups@2021-10-01' = {
resource containerGroup 'Microsoft.ContainerInstance/containerGroups@2023-05-01' = {
name: containerInstanceName
location: location
properties: {
Expand Down Expand Up @@ -55,12 +49,12 @@ resource containerGroup 'Microsoft.ContainerInstance/containerGroups@2021-10-01'
imageRegistryCredentials: [
{
server: acr.properties.loginServer
username: acrCredentials.username
password: acrCredentials.passwords[0].value
username: acr.listCredentials().username
password: acr.listCredentials().passwords[0].value
}
]
}
}

output containerIPv4Address string = containerGroup.properties.ipAddress.ip
output fqdn string = containerGroup.properties.ipAddress.fqdn
output uri string = 'http://${containerGroup.properties.ipAddress.ip}:${containerPort}'
2 changes: 1 addition & 1 deletion azd/aci/modules/container-instance.bicep
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ param registryUsername string
param registryPassword string
param environmentVariables array = []

resource containerGroup 'Microsoft.ContainerInstance/containerGroups@2021-10-01' = {
resource containerGroup 'Microsoft.ContainerInstance/containerGroups@2023-05-01' = {
name: name
location: location
tags: tags
Expand Down
9 changes: 7 additions & 2 deletions azd/acr/modules/acr.bicep
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ param location string = resourceGroup().location
param sku string = 'Basic'
param addAdminUser bool = true

resource acr 'Microsoft.ContainerRegistry/registries@2021-06-01-preview' = {
resource acr 'Microsoft.ContainerRegistry/registries@2023-07-01' = {
name: registryName
location: location
sku: {
Expand All @@ -15,7 +15,12 @@ resource acr 'Microsoft.ContainerRegistry/registries@2021-06-01-preview' = {
}
}

// Outputs for linking to AKS
// Outputs for linking to AKS and other services
output acrId string = acr.id
output acrName string = acr.name
output acrLoginServer string = acr.properties.loginServer
// Alias outputs used by ACI/ACA modules
output name string = acr.name
output loginServer string = acr.properties.loginServer
output adminUsername string = acr.listCredentials().username
output adminPassword string = acr.listCredentials().passwords[0].value
Loading
Loading