Я создал образ Docker, который успешно отправил в репозиторий Реестра контейнеров Azure (ACR).
Но я не могу создать экземпляр контейнера Azure, запуская его через Azure Powershell:
> New-AzContainerGroup -ResourceGroupName rg-docker-test -Name framerapi-cg -Location francecentral -Container $container -IpAddressType Public
Когда я получаю сообщение об ошибке:
The image 'crdockertest.azurecr.io/framerapi:latest' in container group 'framerapi-cg' is not accessible. Please check the image and registry credential.
Но мне удалось без проблем отправить его в ACR:
> Connect-AzContainerRegistry -Name crdockertest
Login Succeeded
> docker push --all-tags crdockertest.azurecr.io/framerapi
И я даже могу это вытащить:
> docker pull crdockertest.azurecr.io/framerapi
Но я обнаружил, что, включив «Администратор» для реестра, я могу создать группу контейнеров, используя сгенерированные учетные данные:
> $pwd = ConvertTo-SecureString -AsPlainText ...
> $credentials = New-AzContainerGroupImageRegistryCredentialObject -Server crdockertest.azurecr.io -Username crdockertest -Password $pwd
> New-AzContainerGroup -ResourceGroupName rg-docker-test -Name framerapi-cg -Location francecentral -Container $container -IpAddressType Public -ImageRegistryCredential $credentials
Почему обычная аутентификация через Connect-AzContainerRegistry
(и Connect-AzAccount
, если это имеет значение) не работает?
Что исправить?
Как будто я хорошо понимаю, что режим «Администратор» не подходит для производства, только для разработки/тестирования.
Вот как я использую PowerShell и AZ для успешного развертывания образа контейнера в экземплярах контейнеров Azure без использования имени пользователя и пароля администратора.
Просто заполните переменные своими данными.
# Step 1: Create a user-assigned managed identity
Write-Host "`nCreating a user-assigned managed identity '${identityName}'."
$identity = az identity create --name $identityName `
--resource-group $rgname `
--output json | ConvertFrom-Json
$identityId = $identity.id
$principalId = $identity.principalId
$clientId = $identity.clientId
Write-Host "User-assigned managed identity created"
Write-Host "id: ${identityId}"
Write-Host "PrincipalId: ${principalId}"
Write-Host "ClientId: ${clientId}"
# Step 2: Get the Azure Container Registry ID
Write-Host "`n`nRetrieving the Azure Container Registry ID"
$containerRegistry = az acr show --name $acrname --output json | ConvertFrom-Json
$acrid = $containerRegistry.id
Write-Host "Azure Container Registry ID: ${acrid}"
# Step 3: Assign the AcrPull role to the managed identity on the ACR
Write-Host "`n`nAssigning AcrPull role to the managed identity on the container registry."
$role = az role assignment create --assignee $principalId --role "AcrPull" --scope $acrid --output json | ConvertFrom-Json
# Step 4: Create a Log Analytics workspace
Write-Host "`n`nCreating a Log Analytics workspace named '${workspaceName}'"
$logAnalyticsWorkspace = az monitor log-analytics workspace create `
--resource-group $rgname `
--workspace-name $workspaceName `
--location $location `
--output json | ConvertFrom-Json
$workspaceId = $logAnalyticsWorkspace.customerId
Write-Host "Log Analytics workspace created with id ${workspaceId}"
# Step 5: Get Log Analytics workspace keys
Write-Host "`n`nGet log analytics workspace keys"
$workspaceKeys = az monitor log-analytics workspace get-shared-keys `
--resource-group $rgname `
--workspace-name $workspaceName `
--output json | ConvertFrom-Json
$workspaceKey = $workspaceKeys.primarySharedKey
# Step 6: Create Azure Container Instance
Write-Host "`n`nCreating Azure Container Instance"
$container = az container create --resource-group $rgname `
--name $containerInstanceName `
--image "${acrname}.azurecr.io/${imagename}:latest" `
--cpu 0.5 `
--memory 0.5 `
--ports 8080 `
--dns-name-label $containerInstanceName `
--assign-identity $identityId `
--acr-identity $identityId `
--log-analytics-workspace $workspaceId `
--log-analytics-workspace-key $workspaceKey `
--environment-variables AZURE_CLIENT_ID=$clientId `
--output json | ConvertFrom-Json
$containerId = $container.id
$hostName = $container.ipAddress.fqdn
# Final Output
Write-Host "`n`nCloudDebugger container image deployed to Azure Container Instance." -ForegroundColor Green
Write-Host "Hostname: http://${hostName}:8080" -ForegroundColor Green
Надеюсь, это поможет.