Tenho um script python que usa a função DefaultAzureCredential() fornecida pela biblioteca azure.identity. Isso funciona bem localmente quando estou logado na minha conta do Azure que tem as permissões corretas e o script é executado.
Agora, quero executar o script de dentro de um contêiner docker usando as variáveis de ambiente armazenadas no meu cofre de chaves. Até onde posso ver, isso deve funcionar. A imagem é criada e enviada para meu registro de contêiner do Azure por meio de uma identidade gerenciada. No entanto, quando puxo a imagem e tento executá-la, recebo o seguinte erro:
default_credential = DefaultAzureCredential()
^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/azure/identity/_credentials/default.py", line 149, in __init__
credentials.append(EnvironmentCredential(authority=authority, _within_dac=True, **kwargs))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/azure/identity/_credentials/environment.py", line 70, in __init__
self._credential = ClientSecretCredential(
^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/azure/identity/_credentials/client_secret.py", line 45, in __init__
raise ValueError("client_id should be the id of a Microsoft Entra application")
ValueError: client_id should be the id of a Microsoft Entra application
Meu arquivo yaml se parece com isso:
parameters:
- name: KVConnection
type: string
default: 'read-keyvault'
- name: keyVault
type: string
default: 'bi-pv-kv'
- name: containerRegistry
type: string
default: 'dcr'
- name: CRconnection
type: string
default: 'buildandpushdocker'
steps:
- task: AzureKeyVault@2
displayName: "Get KV secrets"
inputs:
azureSubscription: ${{ parameters.KVConnection }}
KeyVaultName: ${{ parameters.keyVault }}
SecretsFilter: '*'
RunAsPreJob: true
- bash: |
echo "##vso[task.setvariable variable=clientid]$(sp-client-id)"
echo "##vso[task.setvariable variable=clientcred]$(sp-az-secret)"
echo "##vso[task.setvariable variable=tenantid]$(sp-tenant-id)"
displayName: Set environment variables
- task: Docker@2
displayName: Build Planview image
inputs:
command: build
repository: planview
containerRegistry: ${{ parameters.containerRegistry }}
identity: ${{ parameters.CRconnection }}
arguments: '--build-arg AZURE_CLIENT_ID=$(clientid) --build-arg AZURE_TENANT_ID=$(tenantid)
--build-arg AZURE_CLIENT_SECRET=$(clientcred)'
tags: |
planview
- task: Docker@2
displayName: Push Planview image
inputs:
command: push
repository: planview
containerRegistry: ${{ parameters.containerRegistry }}
identity: ${{ parameters.CRconnection }}
tags: |
planview
Há um erro gritante aí ou como ele pode ser melhorado? As conexões de serviço foram todas adicionadas corretamente. Eu tentei codificar as credenciais exatas do vault em um dockerfile local que rodava localmente e também funcionou lá, sugerindo que o problema é realmente devido aos 3 segredos não serem manipulados corretamente.
Qualquer sugestão ou ajuda será muito apreciada.
Até onde testei com base no fluxo de trabalho do seu pipeline, o problema não parece ter origem no pipeline em si. Recomendo que você verifique novamente como seu script Python lê as variáveis de ambiente definidas no seu Dockerfile.
Para sua referência, forneci meus arquivos de exemplo, que imprimiram com sucesso os valores esperados das variáveis de ambiente quando executei o contêiner.
azure-pipelines.yml
print_env.py
Arquivo Docker