Часто задаваемые вопросы о Реестре контейнеров Azure

В этой статье рассматриваются часто задаваемые вопросы и известные проблемы Реестра контейнеров Azure.

Рекомендации по устранению неполадок в реестре см. в следующих статьях:

Управление ресурсами

Можно ли создать реестр контейнеров Azure с помощью шаблона Resource Manager?

Да. Вот шаблон, который можно использовать для создания реестра.

Есть ли возможность проверки образов в ACR на уязвимости системы безопасности?

Да. См. документацию из Microsoft Defender для облака, Twistlock и Aqua.

Как настроить Kubernetes с помощью Реестра контейнеров Azure?

См. документацию по Kubernetes и инструкции для Службы Azure Kubernetes.

Как получить учетные данные администратора для реестра контейнеров?

Важно!

Учетная запись администратора предоставляет доступ к реестру одному пользователю. Она предназначена, главным образом, для тестирования. Не рекомендуется совместное использование учетных данных администратора несколькими пользователями. Для пользователей и субъектов-служб в сценариях автоматического входа рекомендуется использовать отдельные удостоверения. См. общие сведения о проверке подлинности.

Перед получением учетных данных администратора убедитесь в том, что администратор реестра включен.

Получение учетных данных с помощью Azure CLI:

az acr credential show -n myRegistry

С помощью Azure PowerShell:

Invoke-AzureRmResourceAction -Action listCredentials -ResourceType Microsoft.ContainerRegistry/registries -ResourceGroupName myResourceGroup -ResourceName myRegistry

Как получить учетные данные администратора в шаблоне Resource Manager?

Важно!

Учетная запись администратора предоставляет доступ к реестру одному пользователю. Она предназначена, главным образом, для тестирования. Не рекомендуется совместное использование учетных данных администратора несколькими пользователями. Для пользователей и субъектов-служб в сценариях автоматического входа рекомендуется использовать отдельные удостоверения. См. общие сведения о проверке подлинности.

Перед получением учетных данных администратора убедитесь в том, что администратор реестра включен.

Получение первого пароля:

{
    "password": "[listCredentials(resourceId('Microsoft.ContainerRegistry/registries', 'myRegistry'), '2017-10-01').passwords[0].value]"
}

Получение второго пароля:

{
    "password": "[listCredentials(resourceId('Microsoft.ContainerRegistry/registries', 'myRegistry'), '2017-10-01').passwords[1].value]"
}

Удаление реплика сбой с состоянием "Запрещено", хотя реплика tion удаляется с помощью Azure CLI или Azure PowerShell

Эта ошибка возникает, когда у пользователя есть разрешения на доступ к реестру, но нет разрешений для чтения подписки. Чтобы решить эту проблему, назначьте пользователю разрешения читателя для подписки:

az role assignment create --role "Reader" --assignee user@contoso.com --scope /subscriptions/<subscription_id> 

Правила брандмауэра обновляются успешно, но они не вступают в силу

Распространение изменений, внесенных в правила брандмауэра, занимает некоторое время. После изменения параметров брандмауэра подождите несколько минут, прежде чем проверять это изменение.

Операции с реестром

Как получить доступ к API HTTP для реестра Docker версии 2?

ACR поддерживает API HTTP для реестра Docker версии 2. Доступ к API можно получить по адресу https://<your registry login server>/v2/. Пример: https://mycontainerregistry.azurecr.io/v2/

Как удалить все манифесты, на которые не ссылается ни один тег в репозитории?

Если вы используете bash:

az acr manifest list-metadata --name myRepository --registry myRegistry --query "[?tags[0]==null].digest" --output tsv  | xargs -I% az acr repository delete --name myRegistry ---image myRepository@%

Для PowerShell:

az acr manifest list-metadata --name myRepository --repository myRegistry --query "[?tags[0]==null].digest" --output tsv | %{ az acr repository delete --name myRegistry --image myRepository@$_ }

Примечание.

Вы можете добавить -y в команду удаления, чтобы пропустить подтверждение.

Дополнительные сведения см. в статье Удаление образов контейнеров в службе "Реестр контейнеров Azure".

Почему израсходованная квота реестра не уменьшается после удаления образов?

Такая ситуация может возникнуть, если другие образы контейнеров по-прежнему ссылаются на базовые слои. Если удалить образ без ссылок, данные по использованию реестра будут обновлены через несколько минут.

Как проверить изменения квоты хранилища?

Создайте образ с уровнем 1 ГБ, используя приведенный ниже файл Docker. В результате образ будет иметь уровень, который не используется ни одним другим образом в реестре.

FROM alpine
RUN dd if=/dev/urandom of=1GB.bin  bs=32M  count=32
RUN ls -lh 1GB.bin

Выполните сборку образа и отправьте его в реестр с помощью CLI Docker.

docker build -t myregistry.azurecr.io/1gb:latest .
docker push myregistry.azurecr.io/1gb:latest

Вы можете увидеть, что использование хранилища увеличилось, на портале Azure либо запросить данные по использованию с помощью интерфейса CLI.

az acr show-usage -n myregistry

Удалите образ с помощью Azure CLI или портала и проверьте обновленные данные по использованию через несколько минут.

az acr repository delete -n myregistry --image 1gb

Как пройти проверку подлинности в реестре при запуске CLI в контейнере?

Необходимо запустить контейнер Azure CLI, подключив сокет Docker:

docker run -it -v /var/run/docker.sock:/var/run/docker.sock azuresdk/azure-cli-python:dev

В контейнере установите docker:

apk --update add docker

Затем пройдите проверку подлинности в реестре:

az acr login -n MyRegistry

Как включить протокол TLS 1.2?

Включите TLS 1.2 с помощью любого нового клиента Docker (версии не ниже 18.03.0).

Важно!

С 13 января 2020 года Реестр контейнеров Azure будет требовать использовать протокол TLS версии 1.2 для всех безопасных подключений серверов и приложений. Поддержка протоколов TLS версии 1.0 и 1.1 будет прекращена.

Поддерживает ли Реестр контейнеров Azure доверие содержимому?

Да, вы можете использовать доверенные образы в Реестре контейнеров Azure, так как служба Docker Notary была интегрирована и ее можно включить. Подробные сведения см. в статье Доверие содержимому в Реестре контейнеров Azure.

Где находится файл для отпечатка?

По пути ~/.docker/trust/tuf/myregistry.azurecr.io/myrepository/metadata:

  • Открытые ключи и сертификаты всех ролей (за исключением ролей делегирования) хранятся в root.json.
  • Открытые ключи и сертификаты роли делегирования хранятся в JSON-файле родительской роли (например, targets.json для роли targets/releases).

Рекомендуется проверить эти открытые ключи и сертификаты после общей проверки TUF, выполненной Docker и клиентом Notary.

Как предоставить доступ к извлекаемым или передаваемым образам без разрешения на управление ресурсом реестра?

ACR поддерживает пользовательские роли, предоставляющие различные уровни разрешений. В частности, роли AcrPull и AcrPush позволяют пользователям получать и отправлять образы без разрешения на управление ресурсом реестра в Azure.

  • Портал Azure: ваш реестр -> Управление доступом (IAM) -> Добавить (выберите роль AcrPull или AcrPush).

  • Azure CLI: найдите идентификатор ресурса реестра, выполнив следующую команду:

    az acr show -n myRegistry
    

    Затем можно назначить пользователю роль AcrPull или AcrPush (в следующем примере используется AcrPull):

    az role assignment create --scope resource_id --role AcrPull --assignee user@example.com
    

    Можно также назначить роль субъекту-службе, определяемому идентификатором приложения:

    az role assignment create --scope resource_id --role AcrPull --assignee 00000000-0000-0000-0000-000000000000
    

После этого пользователь с ролью сможет проходить проверку подлинности и получать доступ к образам в реестре.

  • Проверка подлинности в реестре:

    az acr login -n myRegistry 
    
  • Вывод списка репозиториев:

    az acr repository list -n myRegistry
    
  • Получение образа:

    docker pull myregistry.azurecr.io/hello-world
    

При использовании только роли AcrPull или AcrPush у пользователя нет разрешения на управление ресурсом реестра в Azure. Например, с помощью команды az acr list или az acr show -n myRegistry нельзя просмотреть реестр.

Как включить автоматическое помещение образов в карантин для реестра?

В настоящее время помещение образов в карантин — это предварительная версия функции в ACR. Вы можете включить режим карантина для реестра, чтобы обычным пользователям были видны только те образы, которые успешно прошли проверку безопасности. Подробные сведения см. в репозитории ACR в GitHub.

Как включить анонимный доступ для извлечения?

Дополнительные сведения см. в разделе Обеспечение общедоступного содержимого реестра.

Как отправлять нераспространяемые слои в реестр?

Нераспространяемый слой в манифесте содержит параметр URL-адреса, из которого может быть получено содержимое. Некоторые возможные варианты использования предназначены для реестров с ограниченным сетевым доступом, реестров, отключенных от Интернета, с ограниченным доступом или реестров без доступа к Интернету.

Например, если правила NSG у вас настроены таким образом, чтобы виртуальная машина могла извлекать образы только из реестра контейнеров Azure, Docker будет выдавать сбои для внешних и нераспространяемых слоев. Например, образ Windows Server Core будет содержать ссылки на внешние слои в реестр контейнеров Azure в своем манифесте и не будет доступен для извлечения в этом сценарии.

Чтобы включить отправку нераспространяемых слоев, выполните следующие действия:

  1. Измените файл daemon.json, который находится в /etc/docker/ на узлах Linux и в C:\ProgramData\docker\config\daemon.json на Windows Server. Если до этого файл был пустым, добавьте следующее содержимое:

    {
      "allow-nondistributable-artifacts": ["myregistry.azurecr.io"]
    }
    

    Примечание.

    Значение представляет собой массив адресов реестра, разделенных запятыми.

  2. Сохраните и закройте файл.

  3. Перезапустите Docker.

При отправке образов в реестры из списка их нераспространяемые слои отправляются в реестр.

Предупреждение

Способы и места распространения и совместного использования нераспространяемых артефактов ограничены. Используйте эту функцию только для отправки артефактов в частные реестры. Убедитесь, что вы выполняете все условия распространения нераспространяемых артефактов.

Диагностика и проверки работоспособности

Проверьте работоспособность с помощью az acr проверка-health

Сведения об устранении распространенных проблем среды и реестра см. в статье Проверка работоспособности реестра контейнеров Azure.

Сбой при извлечении Docker с ошибкой: net/http: запрос отменен во время ожидания подключения (client.Timeout превышен во время ожидания заголовков)

  • Если эта ошибка является временной, повторная попытка завершится успешно.
  • Если команда docker pull постоянно завершается сбоем, возможно, имеется проблема с управляющей программой Docker. Как правило, такую проблему можно устранить путем перезапуска управляющей программы Docker.
  • Если эта проблема не пропадает после перезапуска управляющей программы Docker, она может быть связана с неполадками сетевого подключения на компьютере. Чтобы проверить общую работоспособность сети на компьютере, выполните приведенную ниже команду для проверки подключения к конечной точке. Минимальная версия az acr, содержащая эту команду проверки подключения, — 2.2.9. Если используется более старая версия, обновите Azure CLI.
az acr check-health -n myRegistry
  • Все операции клиента Docker должны предусматривать механизм повторного выполнения.

Docker pull является медленным

Используйте это средство для проверки скорости скачивания по сети на компьютере. Если сетевое подключение компьютера работает медленно, попробуйте использовать виртуальную машину Azure в том же регионе, что и реестр, чтобы увеличить скорость сети.

Push-отправка Docker медленна

Используйте это средство для проверки скорости отправки по сети на компьютере. Если сетевое подключение компьютера работает медленно, попробуйте использовать виртуальную машину Azure в том же регионе, что и реестр, чтобы увеличить скорость сети.

Отправка Docker завершается успешно, но запрос docker завершается ошибкой: несанкционированная проверка подлинности

Эта ошибка может возникать при использовании версии Red Hat управляющей программы Docker, в которой параметр --signature-verification включен по умолчанию. Проверить параметры управляющей программы Docker для Red Hat Enterprise Linux (RHEL) или Fedora можно с помощью следующей команды:

grep OPTIONS /etc/sysconfig/docker

Например, Fedora 28 Server имеет следующие параметры управляющей программы Docker:

OPTIONS='--selinux-enabled --log-driver=journald --live-restore'

При отсутствии --signature-verification=false команда docker pull завершается ошибкой наподобие следующей:

Trying to pull repository myregistry.azurecr.io/myimage ...
unauthorized: authentication required

Чтобы устранить эту ошибку, сделайте следующее:

  1. Добавьте параметр --signature-verification=false в файл конфигурации управляющей программы Docker /etc/sysconfig/docker. Например:

    OPTIONS='--selinux-enabled --log-driver=journald --live-restore --signature-verification=false'

  2. Перезапустите службу управляющей программы Docker, выполнив следующую команду:

    sudo systemctl restart docker.service
    

Чтобы получить подробные сведения о --signature-verification, выполните команду man dockerd.

az acr login успешно завершается, но docker завершается ошибкой: несанкционированная проверка подлинности

Убедитесь в том, что используется URL-адрес сервера в нижнем регистре, например docker push myregistry.azurecr.io/myimage:latest, даже если имя ресурса реестра содержит символы в верхнем или смешанном регистре, например myRegistry.

Включение и получение журналов отладки управляющей программы Docker

Запустите dockerd с параметром debug. Сначала создайте файл конфигурации управляющей программы Docker (/etc/docker/daemon.json), если его нет, и добавьте параметр debug:

{    
    "debug": true    
}

Затем перезапустите управляющую программу. Например, в Ubuntu 14.04:

sudo service docker restart

Подробные сведения можно найти в документации по Docker.

  • Журналы могут создаваться в разных местах в зависимости от используемой системы. Например, в Ubuntu 14.04 это /var/log/upstart/docker.log.
    Подробные сведения см. в документации по Docker.

  • Для Docker для Windows журналы создаются в папке %LOCALAPPDATA%/docker/. Однако они пока могут содержать не всю отладочную информацию.

    Для доступа к полному журналу управляющей программы могут потребоваться дополнительные действия:

    docker run --privileged -it --rm -v /var/run/docker.sock:/var/run/docker.sock -v /usr/local/bin/docker:/usr/local/bin/docker alpine sh
    
    docker run --net=host --ipc=host --uts=host --pid=host -it --security-opt=seccomp=unconfined --privileged --rm -v /:/host alpine /bin/sh
    chroot /host
    

    Теперь у вас есть доступ ко всем файлам виртуальной машины, в которой выполняется dockerd. Журнал находится в файле /var/log/docker.log.

Новые разрешения пользователя могут не быть эффективными сразу после обновления

При предоставлении новых разрешений (ролей) субъекту-службе изменение может вступать в силу не сразу. Есть две возможные причины.

  • Задержка назначения ролей Microsoft Entra. Обычно оно происходит быстро, но из-за задержки распространения может занимать несколько минут.

  • Задержка применения разрешений на сервере токенов ACR может достигать до 10 минут. Чтобы устранить эту проблемы, можно выполнить команду docker logout, а затем снова пройти проверку подлинности с теми же учетными данными через одну минуту:

    docker logout myregistry.azurecr.io
    docker login myregistry.azurecr.io
    

В настоящее время ACR не поддерживает удаление домашней репликации пользователями. В качестве обходного пути можно включить в шаблон команду создания домашней репликации, но пропустить ее создание, добавив "condition": false, как показано ниже:

{
    "name": "[concat(parameters('acrName'), '/', parameters('location'))]",
    "condition": false,
    "type": "Microsoft.ContainerRegistry/registries/replications",
    "apiVersion": "2017-10-01",
    "location": "[parameters('location')]",
    "properties": {},
    "dependsOn": [
        "[concat('Microsoft.ContainerRegistry/registries/', parameters('acrName'))]"
     ]
},

Сведения о проверке подлинности не заданы в правильном формате при прямых вызовах REST API

Может возникнуть ошибка InvalidAuthenticationInfo, особенно при использовании средства curl с параметром -L, --location (для поддержки перенаправлений). Например, получение большого двоичного объекта с помощью curl с параметром -L и обычной проверкой подлинности:

curl -L -H "Authorization: basic $credential" https://$registry.azurecr.io/v2/$repository/blobs/$digest

может привести к следующему ответу:

<?xml version="1.0" encoding="utf-8"?>
<Error><Code>InvalidAuthenticationInfo</Code><Message>Authentication information is not given in the correct format. Check the value of Authorization header.
RequestId:00000000-0000-0000-0000-000000000000
Time:2019-01-01T00:00:00.0000000Z</Message></Error>

Основная причина заключается в том, что некоторые реализации curl поддерживают перенаправления с заголовками из исходного запроса.

Чтобы устранить эту проблему, необходимо выполнять перенаправления вручную без заголовков. Выведите заголовки ответа с параметром -D -curl, а затем извлеките заголовок Location:

REDIRECT_URL=$(curl -s -D - -H "Authorization: basic $credential" https://$registry.azurecr.io/v2/$repository/blobs/$digest | grep "^Location: " | cut -d " " -f2 | tr -d '\r')
curl $REDIRECT_URL

Почему на портале Azure отображаются не все мои репозитории или теги?

В браузере Microsoft Edge или Internet Explorer отображается не более 100 репозиториев или тегов. Если в реестре более 100 репозиториев или тегов, для вывода их списка рекомендуется использовать браузер Firefox или Chrome.

Почему порталу Azure не удается получить репозитории или теги?

Возможно, браузеру не удается отправить на сервер запрос на получение репозиториев или тегов. Это может происходить по разным причинам:

  • отсутствие подключения к сети;
  • Брандмауэр
  • Использование портала из общедоступной сети для реестра, который разрешает только частный доступ
  • блокировщики рекламы;
  • ошибки DNS.

Обратитесь к администратору сети или проверьте конфигурацию сети и подключение. Попробуйте выполнить команду az acr check-health -n yourRegistry в Azure CLI, чтобы проверить, может ли среда подключиться к Реестру контейнеров. Кроме того, в браузере можно попробовать использовать режим инкогнито или частный сеанс, чтобы избежать проблем с устаревшим кэшем или файлами cookie.

Почему не удается выполнить запрос на вытягивание или отправку из-за неразрешенной операции?

Ниже приведены некоторые сценарии, в которых операции могут быть запрещены.

  • Классические реестры больше не поддерживаются. Выполните обновление до поддерживаемого уровня служб с помощью команды az acr update или на портале Azure.
  • Образ или репозиторий может быть заблокирован, поэтому его нельзя удалить или обновить. Для просмотра текущих атрибутов можно использовать команду az acr repository show .
  • Некоторые операции запрещены, если образ находится на карантине. Дополнительные сведения о карантине.
  • Возможно, ваш реестр достиг предельного размера хранилища.

Недопустимый или неподдерживаемый формат репозитория

Если отображается сообщение об ошибке, такое как "неподдерживаемый формат репозитория", "недопустимый формат" или "запрошенные данные не существуют", при указании имени репозитория в операциях репозитория, проверьте правильность и регистр написания имени. Допустимые имена репозитория могут включать только строчные буквы, цифры, точки, дефисы, подчеркивания и символы косой черты.

Как собрать данные трассировки HTTP в Windows?

Необходимые компоненты

Контейнеры Windows

Настройка адрес прокси-сервера Docker 127.0.0.1:8888.

Контейнеры Linux

Определите IP-адрес виртуального коммутатора виртуальной машины Docker:

(Get-NetIPAddress -InterfaceAlias "*Docker*" -AddressFamily IPv4).IPAddress

Задайте в качестве адреса прокси-сервера Docker выходные данные предыдущей команды и укажите порт 8888 (например, 10.0.75.1:8888).

Задачи

Как массово отменить выполнения?

Приведенные ниже команды отменяют все выполняемые задачи в указанном реестре.

az acr task list-runs -r $myregistry --run-status Running --query '[].runId' -o tsv \
| xargs -I% az acr task cancel-run -r $myregistry --run-id %

Как включить папку .git в команду az acr build?

Если передать локальную папку с исходным кодом в команду az acr build, папка .git по умолчанию исключается из отправляемого пакета. Можно создать файл .dockerignore со следующим параметром. Он предписывает команде восстановить все файлы из папки .git в отправляемом пакете.

!.git/**

Этот параметр также применяется к команде az acr run.

Поддерживают ли задачи GitLab для исходных триггеров?

В настоящее время GitLab для исходных триггеров не поддерживается.

Какая служба управления репозиторием GIT поддерживает задачи?

Служба GIT Исходный контекст Ручная сборка Автоматическая сборка с помощью триггера фиксации
GitHub https://github.com/user/myapp-repo.git#mybranch:myfolder Да Да
Azure Repos https://dev.azure.com/user/myproject/_git/myapp-repo#mybranch:myfolder Да Да
GitLab https://gitlab.com/user/myapp-repo.git#mybranch:myfolder Да Нет
Bitbucket; https://user@bitbucket.org/user/mayapp-repo.git#mybranch:myfolder Да Нет

Устранение ошибок выполнения

Сообщение об ошибке Руководство по устранению неполадок
Доступ к виртуальной машине не настроен, поэтому подписки не найдены Это может произойти, если вы используете az login --identity в задаче ACR. Это временная ошибка, которая возникает, если назначение роли для управляемого удостоверения еще не было распространено. Подождите несколько секунд, а затем повторите попытку.

Интеграция CI/CD

Как устранить проблему, когда создание пула агентов завершается сбоем из-за истечения времени ожидания?

Настройте подходящие правила брандмауэров для существующих групп безопасности сети или определяемых пользователем маршрутов. Для применения правил брандмауэра может потребоваться несколько минут.

Как включение встроенной политики Azure для ACR блокирует включение учетных данных администратора?

Следующая встроенная политика Azure (если задано соответствующее состояние политики) блокирует включение администратора в реестре.

Встроенная политика Azure Состояние политики Состояние администратора
Настройте реестры контейнеров, чтобы отключить локальную учетную запись администратора. Изменить Disable
В реестрах контейнеров должна быть отключена локальная учетная запись администратора. Запрет Disable
В реестрах контейнеров должна быть отключена локальная учетная запись администратора. Аудит несоответствующие

Следующие шаги