Короткий ответ
docker login REGISTRY сохраняет учётные данные (токен) в ~/.docker/config.json; для безопасного хранения вместо явного пароля в этом файле нужно использовать credential helper (например, docker-credential-pass/облачный helper), а в Kubernetes для pull образов используется отдельный объект imagePullSecrets.
Как это работает подробнее
после docker login Docker CLI либо сохраняет (обычно в закодированном, но не зашифрованном виде) токен авторизации прямо в config.json, либо, если настроен credential helper, делегирует хранение секрета специализированному хранилищу ОС (keychain, pass, облачный secret manager) и сохраняет в config.json только ссылку на него. При каждом docker pull/docker push клиент автоматически подставляет сохранённые данные для соответствующего хоста реестра.
Пример кода
$ docker login registry.example.com -u ci-bot
Password: ********
Login Succeeded
$ cat ~/.docker/config.json
{
"auths": {
"registry.example.com": { "auth": "base64-encoded-creds" }
}
}Что использовать на практике
- Практика. в CI-пайплайнах учётные данные для реестра передают через секреты самой CI-системы (а не хранят в репозитории или прямо в Dockerfile), логинясь перед операциями
push; в облачных managed registry (ECR, GCR, ACR) обычно используется краткоживущий токен, получаемый через облачный CLI, а не статический пароль.
Подводные камни
- Риск. хранят
~/.docker/config.jsonс незашифрованным паролем в образе для "удобства" автоматизации или коммитят его в репозиторий; передают логин/пароль registry черезARG/ENVв Dockerfile — такие значения могут остаться видимыми в истории слоёв или в метаданных образа.