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

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

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

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

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

Да. Ниже приведен шаблон , который можно использовать для создания реестра. Этот шаблон предназначен для общедоступного облака Azure. Чтобы использовать этот шаблон для Azure Stack Hub, измените версию API на 2019-05-01, в противном случае развертывание не удастся.

Существует ли проверка уязвимостей системы безопасности для образов в ACR в Azure Stack Hub?

Нет. В настоящее время отсутствует интеграция с Центр безопасности Azure для реестров, развернутых в Azure Stack Hub. Существуют сторонние и открытый код варианты, которые можно использовать для выполнения этой потребности в подключенных или отключенных развертываниях Azure Stack Hub.

Как настроить 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]"
}

Разделы справки отправить образ контейнера в Реестр контейнеров Azure в отключенное развертывание Azure Stack Hub под управлением Kubernetes?

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

  1. Сначала получите необходимые образы контейнеров с помощью компьютера с подключением к Интернету с помощью docker CLI и команды docker pull. Дополнительные сведения см. в статье Импорт образов контейнеров в реестр контейнеров .

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

  3. Используйте команды docker tag и docker push, чтобы пометить образ и отправить его в локальный Реестр контейнеров Azure в репозитории Azure Stack Hub.

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

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

ACR поддерживает API HTTP для реестра Docker версии 2. Доступ к API можно получить по адресу https://<your registry login server>/v2/. Например, https://mycontainerregistry.azsacr.<regionname>.<fqdn>/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 --registry myRegistry --query "[?tags[0]==null].digest" --output tsv | %{ az acr repository delete --name myRegistry --image myRepository@$_ }

Примечание

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

Дополнительные сведения см. в статье Удаление образов контейнеров в службе "Реестр контейнеров 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.azsacr.<regionname>.<fqdn>/1gb:latest .
docker push myregistry.azsacr.<regionname>.<fqdn>/1gb:latest

Вы увидите, что использование хранилища увеличилось на портале Azure Stack Hub, или можете запросить использование с помощью 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 Stack Hub доверие к содержимому?

Нет, текущий выпуск реестра контейнеров Azure в Azure Stack Hub поддерживает только номер SKU "Стандартный" и не поддерживает доверие к содержимому.

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

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

  • Портал Azure Stack Hub: реестр —> контроль доступа (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.azsacr.<regionname>.<fqdn>/hello-world
    

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

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

Нераспространяемый слой в манифесте содержит параметр 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.azsacr.<regionname>.<fqdn>"]
    }
    

    Примечание

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

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

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

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

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

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

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

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

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

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

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

Команда pull Docker выполняется медленно

Используйте это средство для проверки скорости скачивания по сети на компьютере.

Команда push Docker выполняется медленно

Используйте это средство для проверки скорости отправки по сети на компьютере.

Команда docker push выполняется успешно, но команда docker pull завершается ошибкой: "не авторизовано: требуется проверка подлинности"

Эта ошибка может возникать при использовании версии 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.azsacr.<regionname>.<fqdn>/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.azsacr.<regionname>.<fqdn>/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.azsacr.<regionname>.<fqdn>
    docker login myregistry.azsacr.<regionname>.<fqdn>
    

Данные для проверки подлинности предоставляются в неправильном формате при прямых вызовах 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 Stack Hub не перечислены все мои репозитории или теги?

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

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

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

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

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

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

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

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

Формат репозитория недопустим или не поддерживается

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

Как собрать данные трассировки 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).

Дальнейшие действия