Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В задаче ACR можно включить управляемое удостоверение для ресурсов Azure. В задаче это удостоверение будет использоваться для получения доступа к другим ресурсам Azure без необходимости предоставлять учетные данные или управлять ими.
Из этой статьи вы узнаете, как включить управляемое удостоверение в задаче для извлечения образа из реестра, отличающегося от того, который использовался для выполнения задачи.
Для создания ресурсов Azure с помощью инструкций из этой статьи требуется Azure CLI версии 2.0.68 или более поздней версии. Чтобы узнать версию, выполните команду az --version. Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0.
Обзор сценария
В примере задачи базовый образ извлекается из другого реестра контейнеров в Azure для создания и отправки образа приложения. Чтобы извлекать базовый образ, настройте задачу с использованием управляемого удостоверения и назначьте ей соответствующие разрешения.
В этом примере описаны шаги, в которых используется управляемое удостоверение, назначенное пользователем или системой. Выбор идентичности зависит от потребностей вашей организации.
В реальной ситуации у организации может быть набор базовых образов, который все команды разработчиков используют для создания приложений. Эти базовые образы хранятся в корпоративном реестре, и у каждой команды разработчиков есть только права на извлечение.
Предварительные условия
Для работы с этой статьей вам понадобится два реестра контейнеров Azure:
- Первый реестр используется для создания и выполнения задач ACR. В этой статье ему присвоено имя myregistry.
- Во втором реестре размещается базовый образ, используемый в задаче для создания образа. Имя второго реестра в этой статье — mybaseregistry.
На следующих шагах замените эти значения именами ваших реестров.
Если у вас еще нет необходимых реестров контейнеров Azure, см Краткое руководство: Создание частного реестра контейнеров с использованием Azure CLI. На этом этапе не нужно отправлять образы в реестр.
Подготовка базового реестра
В демонстрационных целях в качестве одноразовой операции выполните команду [az acr import][az-acr-import], чтобы импортировать общедоступный образ Node.js из Docker Hub в базовый реестр. На практике другая команда или процесс в организации могут поддерживать образы в базовом реестре.
az acr import --name mybaseregistry \
--source docker.io/library/node:15-alpine \
--image baseimages/node:15-alpine
Определение шагов задачи в файле YAML
В этом примере шаги для многоэтапной задачи определяются в файле YAML. Создайте файл с именем helloworldtask.yaml в локальной рабочей папке и вставьте в него следующее содержимое. Измените значение REGISTRY_NAME на этапе создания, указав имя сервера в базовом реестре.
version: v1.1.0
steps:
# Replace mybaseregistry with the name of your registry containing the base image
- build: -t $Registry/hello-world:$ID https://github.com/Azure-Samples/acr-build-helloworld-node.git#main -f Dockerfile-app --build-arg REGISTRY_NAME=mybaseregistry.azurecr.io
- push: ["$Registry/hello-world:$ID"]
Для создания образа используется файл Dockerfile-app в репозитории Azure-Samples/acr-build-helloworld-node.
--build-arg ссылается на базовый реестр для извлечения базового образа. Созданный образ отправляется в реестр, используемый для выполнения задачи.
Вариант 1: Создать задачу с идентификатором, назначенным пользователем
В этом разделе описано, как создать задачу и активировать удостоверение, назначаемое пользователем. Если вы хотите вместо этого включить назначаемое системой удостоверение, см. Вариант 2: Создание задачи с назначаемым системой удостоверением.
Создание назначаемого пользователем идентификатора
Создайте удостоверение с именем myACRTasksId в вашей подписке, используя команду az identity create. Вы можете использовать ту же группу ресурсов, которую указали ранее для создания реестра контейнеров, либо другую.
az identity create \
--resource-group myResourceGroup \
--name myACRTasksId
Чтобы настроить назначаемое пользователем удостоверение в следующих шагах, используйте команду az identity show для сохранения идентификаторов ресурса, субъекта и клиента удостоверения в переменных.
# Get resource ID of the user-assigned identity
resourceID=$(az identity show \
--resource-group myResourceGroup \
--name myACRTasksId \
--query id --output tsv)
# Get principal ID of the task's user-assigned identity
principalID=$(az identity show \
--resource-group myResourceGroup \
--name myACRTasksId \
--query principalId --output tsv)
# Get client ID of the user-assigned identity
clientID=$(az identity show \
--resource-group myResourceGroup \
--name myACRTasksId \
--query clientId --output tsv)
Создать задачу
Теперь создайте задачу helloworldtask, выполнив следующую команду az acr task create. Задача выполняется без контекста исходного кода, а команда ссылается на файл helloworldtask.yaml в рабочей папке. Параметр --assign-identity передает идентификатор ресурса для назначенной пользователем идентификации.
az acr task create \
--registry myregistry \
--name helloworldtask \
--context /dev/null \
--file helloworldtask.yaml \
--assign-identity $resourceID
В выводе команды в разделе identity указано, что в задаче установлена идентификация типа UserAssigned.
[...]
"identity": {
"principalId": null,
"tenantId": null,
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRTasksId": {
"clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222"
}
[...]
Предоставьте полномочия на извлечение идентификатора из основного реестра.
В этом разделе описано, как предоставить управляемому удостоверению разрешения на извлечение данных из базового реестра mybaseregistry.
Используйте команду az acr show, чтобы получить идентификатор ресурса для базового реестра и сохранить его в переменной.
baseregID=$(az acr show --name mybaseregistry --query id --output tsv)
Используйте команду az role assignment create, чтобы назначить правильную роль удостоверению в базовом реестре. Это назначение роли предоставляет разрешения только на извлечение образов из реестра.
Правильная роль, используемая в назначении ролей, зависит от того, включен ли реестр ABAC или нет.
ROLE="Container Registry Repository Reader" # For ABAC-enabled registries. For non-ABAC registries, use AcrPull.
az role assignment create \
--assignee $principalID \
--scope $baseregID \
--role "$ROLE"
Перейдите к разделу Добавление в задачу учетных данных целевого реестра.
Опция 2: Создать задачу с системно назначенной идентификацией
В этом разделе описано, как создать задачу и включить идентификатор, назначаемый системой. Если вы хотите включить назначенное пользователем удостоверение, см. Вариант 1: Создание задачи с назначенным пользователем удостоверением.
Создать задачу
Теперь создайте задачу helloworldtask, выполнив следующую команду az acr task create. Задача выполняется без контекста исходного кода, а команда ссылается на файл helloworldtask.yaml в рабочей папке. Параметр --assign-identity при отсутствии значения включает назначаемую системой идентичность в задаче.
az acr task create \
--registry myregistry \
--name helloworldtask \
--context /dev/null \
--file helloworldtask.yaml \
--assign-identity
В выходных данных команды в разделе identity указано, что в задаче установлен идентификатор типа SystemAssigned.
principalId является основным идентификатором для идентичности задачи.
[...]
"identity": {
"principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
"tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"type": "SystemAssigned",
"userAssignedIdentities": null
},
"location": "eastus",
[...]
С помощью команды az acr task show сохраните principalId в переменной, что использовать это значение в следующих командах. Подставьте имя задачи и реестра в следующей команде:
principalID=$(az acr task show \
--name <task_name> --registry <registry_name> \
--query identity.principalId --output tsv)
Предоставьте полномочия на извлечение идентификатора из основного реестра.
В этом разделе описано, как предоставить управляемому удостоверению разрешения на извлечение данных из базового реестра mybaseregistry.
Используйте команду az acr show, чтобы получить идентификатор ресурса для базового реестра и сохранить его в переменной.
baseregID=$(az acr show --name mybaseregistry --query id --output tsv)
Используйте команду az role assignment create, чтобы назначить правильную роль удостоверению в базовом реестре. Это назначение роли предоставляет разрешения только на извлечение образов из реестра.
Правильная роль, используемая в назначении ролей, зависит от того, включен ли реестр ABAC или нет.
ROLE="Container Registry Repository Reader" # For ABAC-enabled registries. For non-ABAC registries, use AcrPull.
az role assignment create \
--assignee $principalID \
--scope $baseregID \
--role "$ROLE"
Добавьте учетные данные целевого реестра в задачу
Теперь с помощью команды az acr task credential add разрешите задачам выполнять проверку подлинности в базовом реестре с использованием учетных данных удостоверения. Выполните команду в соответствии с типом управляемого удостоверения, активированного в рамках задачи. Если вы включили пользовательскую идентичность, передайте --use-identity с ID клиента этой идентичности. Если вы включили удостоверение, назначаемое системой, передайте --use-identity [system].
# Add credentials for user-assigned identity to the task
az acr task credential add \
--name helloworldtask \
--registry myregistry \
--login-server mybaseregistry.azurecr.io \
--use-identity $clientID
# Add credentials for system-assigned identity to the task
az acr task credential add \
--name helloworldtask \
--registry myregistry \
--login-server mybaseregistry.azurecr.io \
--use-identity [system]
Выполнение задачи вручную
Чтобы проверить, выполняется ли задача, в которой включено управляемое удостоверение, запустите ее вручную с помощью команды az acr task run.
az acr task run \
--name helloworldtask \
--registry myregistry
Если задача выполняется успешно, выходные данные будут выглядеть примерно так:
Queued a run with ID: cf10
Waiting for an agent...
2019/06/14 22:47:32 Using acb_vol_dbfbe232-fd76-4ca3-bd4a-687e84cb4ce2 as the home volume
2019/06/14 22:47:39 Creating Docker network: acb_default_network, driver: 'bridge'
2019/06/14 22:47:40 Successfully set up Docker network: acb_default_network
2019/06/14 22:47:40 Setting up Docker configuration...
2019/06/14 22:47:41 Successfully set up Docker configuration
2019/06/14 22:47:41 Logging in to registry: myregistry.azurecr.io
2019/06/14 22:47:42 Successfully logged into myregistry.azurecr.io
2019/06/14 22:47:42 Logging in to registry: mybaseregistry.azurecr.io
2019/06/14 22:47:43 Successfully logged into mybaseregistry.azurecr.io
2019/06/14 22:47:43 Executing step ID: acb_step_0. Timeout(sec): 600, Working directory: '', Network: 'acb_default_network'
2019/06/14 22:47:43 Scanning for dependencies...
2019/06/14 22:47:45 Successfully scanned dependencies
2019/06/14 22:47:45 Launching container with name: acb_step_0
Sending build context to Docker daemon 25.6kB
Step 1/6 : ARG REGISTRY_NAME
Step 2/6 : FROM ${REGISTRY_NAME}/baseimages/node:15-alpine
15-alpine: Pulling from baseimages/node
[...]
Successfully built 41b49a112663
Successfully tagged myregistry.azurecr.io/hello-world:cf10
2019/06/14 22:47:56 Successfully executed container: acb_step_0
2019/06/14 22:47:56 Executing step ID: acb_step_1. Timeout(sec): 600, Working directory: '', Network: 'acb_default_network'
2019/06/14 22:47:56 Pushing image: myregistry.azurecr.io/hello-world:cf10, attempt 1
The push refers to repository [myregistry.azurecr.io/hello-world]
[...]
2019/06/14 22:48:00 Step ID: acb_step_1 marked as successful (elapsed time in seconds: 2.517011)
2019/06/14 22:48:00 The following dependencies were found:
2019/06/14 22:48:00
- image:
registry: myregistry.azurecr.io
repository: hello-world
tag: cf10
digest: sha256:611cf6e3ae3cb99b23fadcd89fa144e18aa1b1c9171ad4a0da4b62b31b4e38d1
runtime-dependency:
registry: mybaseregistry.azurecr.io
repository: baseimages/node
tag: 15-alpine
digest: sha256:e8e92cffd464fce3be9a3eefd1b65dc9cbe2484da31c11e813a4effc6105c00f
git:
git-head-revision: 0f988779c97fe0bfc7f2f74b88531617f4421643
Run ID: cf10 was successful after 32s
Чтобы убедиться, что образ создан и успешно отправлен в myregistry, выполните команду az acr repository show-tags.
az acr repository show-tags --name myregistry --repository hello-world --output tsv
Пример результата:
cf10
Следующие шаги
- Узнайте больше о включении управляемого удостоверения в задаче ACR.
- См. справочник по задачам ACR в формате YAML.