Docker Error: unauthorized: authentication required — Решение проблемы
Архитектура авторизации OCI Distribution Spec и HTTP 401/403
Ошибка Error response from daemon: unauthorized: authentication required генерируется реестром контейнеров в соответствии со спецификацией RFC 7235 / OCI Distribution. Сбой происходит, когда клиент не передал заголовок Authorization: Bearer <token>, токен авторизации истек (expired), учетные данные в файле ~/.docker/config.json повреждены, либо учетная запись не имеет прав на чтение (Pull) или запись (Push) в запрашиваемый репозиторий (RBAC / Namespaces).
Бизнес-риски:
Срыв выкатки релизов в production, блокировка доступа автоматизированных систем к приватным репозиториям компании, риски утечки учетных данных из-за неверной настройки токенов.
Таблица структуры авторизационных данных Docker
| Параметр / Файл | Расположение | Назначение |
|---|---|---|
config.json | ~/.docker/config.json или /root/.docker/config.json | Локальное хранилище токенов базовой аутентификации (Base64). |
credStore / credsStore | Внешний helper (pass, osxkeychain, secretservice) | Безопасное системное хранилище секретов авторизации. |
Bearer Realm | Заголовок Www-Authenticate | URL OAuth2-сервера выдачи токенов реестра (Harbor/GitLab). |
Пошаговое восстановление прав доступа и авторизации в реестрах
Сценарий 1: Повторная явная авторизация через CLI
Выполните чистый вход в целевой реестр с валидацией имени хоста:
# Вход в Docker Hub:
docker login -u 'myusername'
# Вход в приватный реестр (Harbor / GitLab / Nexus):
docker login registry.example.com -u 'deploy-robot' --password 'glpat-xxxxxxxxx'
# Проверка валидности файла конфигурации:
cat ~/.docker/config.json | jq .authsСценарий 2: Очистка зависших и устаревших токенов авторизации
Если в config.json остались невалидные токены, Docker продолжит отправлять их вместо анонимного запроса:
# Явный выход из реестра
docker logout registry.example.com
# Если ошибка сохраняется, выполните сброс сессии:
rm -f ~/.docker/config.json
# Повторный вход
docker login registry.example.comСценарий 3: Настройка прав в приватных репозиториях (Harbor/GitLab/AWS ECR)
Проверьте права учетной записи в веб-интерфейсе реестра:
# Для AWS ECR: получение временного токена авторизации (действует 12 часов)
aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.eu-west-1.amazonaws.com
# Для GCP Artifact Registry:
gcloud auth configure-docker europe-docker.pkg.devТиповые ошибки администраторов
- Попытка docker push под учетной записью с правами Read-Only: Роботы CI/CD часто настраиваются только на чтение, что вызывает ошибку unauthorized при сборке.
- Использование спецсимволов в пароле без экранирования: Передача паролей со знаками
$или!в shell-командах без кавычек ломает строку авторизации.
ITSTM внедрит централизованную систему управления секретами (HashiCorp Vault) и настроит ролевую модель доступа (RBAC) в реестрах.
Частые вопросы (FAQ)
Почему ошибка возникает при скачивании публичного образа?
Если имя образа написано с ошибкой, Docker Hub предполагает, что это приватный репозиторий, и запрашивает авторизацию вместо ошибки 404.
Где хранятся учетные данные при запуске Docker от root?
Учетные данные сохраняются в домашней директории текущего пользователя: для root это /root/.docker/config.json, для обычного пользователя — /home/user/.docker/config.json.
Как передать credentials в Kubernetes без docker login на нодах?
Создайте ImagePullSecret через kubectl: kubectl create secret docker-registry regcred --docker-server=... --docker-username=... --docker-password=...
Почему токен сбрасывается после перезагрузки сервера?
Если директория /root смонтирована как tmpfs или очищается скриптами инициализации, сохраняйте config.json через persistent volume или переменные окружения.