В этой статье рассматриваются часто задаваемые вопросы и известные проблемы Реестра контейнеров Azure.
Рекомендации по устранению неполадок в реестре см. в следующих статьях:
Управление ресурсами
Можно ли создать реестр контейнеров Azure (ACR) с помощью шаблона Azure Resource Manager (ARM)?
Да. Ниже приведен шаблон , который можно использовать для создания реестра.
Есть ли возможность проверки образов в 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]"
}
Удаление репликации завершается сбоем с состоянием "Запрещено", хотя репликация удаляется с помощью Azure CLI или Azure PowerShell
Эта ошибка возникает, когда у пользователя есть Container Registry Contributor and Data Access Configuration Administrator роль в реестре, разрешающая удаление реплики с помощью Azure CLI, но отсутствуют разрешения читателя в подписке. Для удаления реплик через Портал требуется доступ читателя по подписке. Чтобы решить эту проблему, назначьте пользователю разрешения читателя для подписки:
az role assignment create --role "Reader" --assignee [email protected] --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 Content Trust. Дополнительные сведения см. в разделе "Доверие к содержимому" в реестре контейнеров Azure.
Где находится файл для отпечатка?
По пути ~/.docker/trust/tuf/myregistry.azurecr.io/myrepository/metadata:
- Открытые ключи и сертификаты всех ролей (за исключением ролей делегирования) хранятся в
root.json. - Открытые ключи и сертификаты роли делегирования хранятся в JSON-файле родительской роли (например,
targets.jsonдля ролиtargets/releases).
Эти открытые ключи и сертификаты следует проверить после общей проверки TUF, выполненной клиентом Docker и нотариусом.
Как предоставить доступ к изображениям для извлечения или отправки без предоставления разрешений на управление ресурсом реестра?
ACR поддерживает управление доступом на основе ролей Microsoft Entra (RBAC) и встроенные роли , предоставляющие различные уровни разрешений на основе Microsoft Entra, например предоставление разрешений на отправку или извлечение изображений без предоставления разрешений всему реестру.
При необходимости вы можете использовать [Управление доступом на основе атрибутов (ABAC) Microsoft Entra] для управления разрешениями репозитория на основе Microsoft Entra и назначением ролей области для определенных репозиториев.
Как включить автоматическое помещение образов в карантин для реестра?
В настоящее время помещение образов в карантин — это предварительная версия функции в ACR. Режим карантина реестра может быть включен таким образом, чтобы обычные пользователи видели только изображения, прошедшие проверку безопасности. Дополнительные сведения см. в репозитории ACR GitHub.
Как включить анонимный доступ для извлечения?
Дополнительные сведения см. в разделе "Сделать содержимое реестра общедоступным".
Как отправить нераспространяемые слои в реестр?
Нераспространяемый слой в манифесте содержит параметр URL, из которого можно получить содержимое. Некоторые возможные варианты использования нераспространяемых отправок уровня относятся к реестрам с ограниченным доступом к сети, реестрам с ограниченным доступом или к реестрам без подключения к Интернету.
Например, если у вас имеются правила группы безопасности сети (NSG), чтобы виртуальная машина могла загружать образы только из реестра контейнеров Azure, Docker может столкнуться с ошибками при загрузке внешних или нераспространяемых слоев. Например, образ Windows Server Core будет содержать ссылки на внешние слои в реестр контейнеров Azure в своем манифесте и не будет доступен для извлечения в этом сценарии.
Чтобы включить выталкивание нераспределяемых слоев:
Измените файл
daemon.json, который находится в/etc/docker/на узлах Linux и вC:\ProgramData\docker\config\daemon.jsonна Windows Server. Если до этого файл был пустым, добавьте следующее содержимое:{ "allow-nondistributable-artifacts": ["myregistry.azurecr.io"] }Примечание.
Значение представляет собой массив адресов реестра, разделенных запятыми.
Сохраните и закройте файл.
Перезапустите Docker.
Когда вы отправляете изображения в реестры в списке, их нераспространяемые слои отправляются в реестр.
Предупреждение
Нераспространяемые артефакты обычно имеют ограничения на то, как и где они могут распространяться и совместно использоваться. Используйте эту функцию только для отправки артефактов в частные реестры. Убедитесь, что вы соблюдаете все условия, регулирующие распространение нераспространяемых артефактов.
Диагностика и проверки работоспособности
Проверьте работоспособность с помощью az acr check-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
Чтобы устранить эту ошибку, сделайте следующее:
Добавьте параметр
--signature-verification=falseв файл конфигурации управляющей программы Docker/etc/sysconfig/docker. Например:OPTIONS='--selinux-enabled --log-driver=journald --live-restore --signature-verification=false'Перезапустите службу управляющей программы 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
}
Затем перезапустите управляющую программу.
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?
Необходимые компоненты
- Включение расшифровки HTTPS в Fiddler
- Включите Docker для использования прокси-сервера через пользовательский интерфейс Docker.
- По завершении отмените эти изменения. Docker не работает, если этот параметр включен, и Fiddler не работает.
Контейнеры 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://[email protected]/user/mayapp-repo.git#mybranch:myfolder |
Да | Нет |
Устранение ошибок выполнения
| Сообщение об ошибке | Руководство по устранению неполадок |
|---|---|
| Доступ к виртуальной машине не настроен, поэтому подписки не найдены | Это может произойти, если вы используете его az login --identity в задаче ACR. Эта ошибка является временной и возникает, когда назначение роли вашего управляемого удостоверения еще не было распространено. Подождите несколько секунд, а затем повторите попытку. |
Интеграция CI/CD
Что делать, если создание пула агентов не удалось из-за проблем с тайм-аутом?
Настройте правильные правила брандмауэров для существующих групп безопасности сети или определяемых пользователем маршрутов. Для применения правил брандмауэра может потребоваться несколько минут.
Как встроенная политика Azure для ACR блокирует включение административных учетных данных?
Следующая встроенная политика Azure, если задано соответствующее состояние политики, блокирует включение пользователей администратора в реестре.
| Встроенная политика Azure | Состояние политики | Состояние администратора |
|---|---|---|
| Настройте реестры контейнеров, чтобы отключить локальную учетную запись администратора. | Изменить | Отключить |
| В реестрах контейнеров должна быть отключена локальная учетная запись администратора. | Запрет | Отключить |
| В реестрах контейнеров должна быть отключена локальная учетная запись администратора. | Аудит | несоответствующие |
Следующие шаги
- Дополнительные сведения о реестре контейнеров Azure.