Как узнать, что докер уже вошел в систему на сервере реестра докеров

118

Я не уверен, что я уже вошел в реестр докеров в строке cmd, используя cmd: docker login. Как вы можете проверить или увидеть, вошли ли вы в систему или нет, не пытаясь нажать?

Вилле Миекк-Оя
источник
Не уверен, что понимаю ваш вопрос? вы хотите знать, вошли ли вы в систему на терминале? почему бы не запустить команду % docker images в терминале и посмотреть, появятся ли ваши изображения?
noobuntu
1
Я хочу знать, вошел ли я в реестр dockerhub в терминале. Я думал, что изображения являются локальными, поэтому он будет показывать только локальные изображения, а не изображения dockerhub.
Ville Miekk-oja
1
Я считаю, что как только вы войдете в докер, вы подключитесь к своему реестру dockerhub. Не думаю, что есть отдельный логин
noobuntu

Ответы:

65

Редактировать 2020

Возвращаясь к ( закрытой ) проблеме github , где указано, что нет фактического сеанса или состояния;

docker login на самом деле не создает какого-либо постоянного сеанса, он только сохраняет учетные данные пользователя на диске, чтобы при необходимости аутентификации он мог прочитать их для входа в систему

Как указывали другие, authsв ~/.docker/config.jsonфайл добавляется запись / узел (это также работает для частных реестров) после успешного входа в систему:

{
    "auths": {
            "https://index.docker.io/v1/": {}
    },
    ...

При выходе из системы эта запись удаляется:

$ docker logout
Removing login credentials for https://index.docker.io/v1/

Содержимое докера config.jsonпосле:

{
    "auths": {},
    ...

Этот файл может быть проанализирован вашим скриптом или кодом, чтобы проверить ваш статус входа.

Альтернативный метод (повторный вход)

Вы можете войти в докер с помощью docker login <repository>

$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If 
you don't have a Docker ID, head over to https://hub.docker.com to 
create one.
Username:

Если вы уже вошли в систему, запрос будет выглядеть так:

$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If 
you don't have a Docker ID, head over to https://hub.docker.com to 
create one.
Username (myusername):        # <-- "myusername"

Для исходного объяснения ~/.docker/config.jsonпроверьте вопрос: как узнать, вошел ли я в частный реестр докеров

Франческо де Гайтенаэр
источник
4
Последняя ссылка говорит о проверке содержимого ~/.docker/config.json.
dusan
3
docker infoочевидно, ненадежен даже для index.docker.io . В настоящее время авторизован и вижу только Registryзапись, нет Username.
knowngarkin
3
Информация о докере больше не показывает имя пользователя. Я нахожусь в Windows с версией докера 18.05.0-ce.
Джованни Басси
3
Что делать, если скрипту нужно проверить?
Teekin 07
Я думаю, это работает только для основного центра докеров. Для аутентификации в любом другом репо вам нужно будет проверить файл config.json.
duane
43

Я использую один из следующих двух способов для этой проверки:

1: Просмотрите файл config.json:

Если вы вошли в систему на «private.registry.com», вы увидите запись для того же, что и следующее ~/.docker/config.json:

"auths": {
    "private.registry.com": {
        "auth": "gibberishgibberishgibberishgibberishgibberishgibberish"
    }
 }

2: попробуйте войти в докер еще раз:

Если вы пытаетесь проверить, есть ли у вас активный сеанс с private.registry.com, попробуйте войти снова:

bash$ docker login private.registry.com
Username (logged-in-user):

Если вы получили результат, подобный приведенному выше, это означает, что logged-in-userуже был активный сеанс с private.registry.com. Если вместо этого вам будет предложено ввести имя пользователя, это будет означать, что нет активного сеанса.

Арнаб
источник
14

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

docker system info | grep -E 'Username|Registry'
Миира бен сгайер
источник
6

Ответы здесь пока не очень полезны:

  • docker info больше не предоставляет эту информацию
  • docker logout является серьезным неудобством - если вы еще не знаете учетные данные и можете легко повторно войти в систему
  • docker login ответ кажется довольно ненадежным и его не так просто проанализировать программой

Мое решение, которое сработало для меня, основано на комментарии @ noobuntu : я подумал, что если я уже знаю изображение, которое хочу вытащить, но я не уверен, что пользователь уже вошел в систему, я могу сделать это:

try pulling target image
-> on failure:
   try logging in
   -> on failure: throw CannotLogInException
   -> on success:
      try pulling target image
      -> on failure: throw CannotPullImageException
      -> on success: (continue)
-> on success: (continue)
Христианин
источник
Это, безусловно, лучшая стратегия: просто попробуйте выполнить pull, если она не удалась, то она не будет авторизована (остальная логика, которая у вас есть, будет зависеть от каждого варианта использования, но первая попытка применима повсеместно).
Оливер
2
Однако кто-то указал на github.com/moby/moby/issues/15466, что есть много причин сбоя, а не только проблема входа в систему, но статус выхода докера не позволяет дифференцировать причину сбоя. Это все еще лучше, чем другие решения, но для полного решения потребуется патч для докера.
Оливер
5

Для частных реестров ничего не отображается в docker info. Однако команда выхода сообщит вам, вошли ли вы в систему:

 $ docker logout private.example.com
 Not logged in to private.example.com

(Хотя это заставит вас снова войти в систему.)

Уилфред Хьюз
источник
5

Схема учетных данных docker cli неудивительно проста, просто взгляните:

cat ~/.docker/config.json

{
  "auths": {
    "dockerregistry.myregistry.com": {},
    "https://index.docker.io/v1/": {}

Это существует в Windows (используйте Get-Content ~\.docker\config.json), и вы также можете потрогать инструмент учетных данных, в котором также указано имя пользователя ... и я думаю, вы даже можете получить пароль

. "C:\Program Files\Docker\Docker\resources\bin\docker-credential-wincred.exe" list

{"https://index.docker.io/v1/":"kcd"}
KCD
источник
В Windows вы можете видеть только имя пользователя, пароль хранится в диспетчере учетных данных (панель управления)
Thorbjørn Ravn Andersen
Думаю, я испорчу сюрприз ... а docker-credential-wincred.exe <store|get|erase|list|version>это значит, что вы можете get
KCD
Эта команда cat должна использовать разделители путей linux: cat ~ / .docker / config.json. Некоторым это может показаться придиркой, но другие читатели могут просто скопировать / вставить его и попробовать, не сразу понимая, что из-за этого возникает ошибка «Нет такого файла или каталога». :-)
charlie arehart
@charliearehart, ты недооцениваешь мою лень, я использовал catпсевдоним в Powershell ... обновлен, чтобы включить оба
KCD
@KCD, ах. :-) Спасибо за разъяснение.
Чарли Арехарт
4

Только что проверил, сегодня это выглядит так:

$ docker login
Authenticating with existing credentials...
Login Succeeded

ПРИМЕЧАНИЕ: это на macOS с последней версией Docker CE, docker-credential-helper - обе установлены вместе с homebrew.

todd_dsm
источник
3

По крайней мере, в «Docker для Windows» вы можете увидеть, вошли ли вы в Docker Hub через пользовательский интерфейс. Просто щелкните правой кнопкой мыши значок докера в области уведомлений Windows: Docker авторизован

BaluJr.
источник
1
как насчет версий докеров без графического интерфейса? или без окон?
Zameer Fouzan
1
Затем вам нужно использовать один из подходов из других ответов.
BaluJr.
2

Если вы хотите просто true/falseзначение, вы можете трубы вашего docker.jsonк jq.

is_logged_in() {
  cat ~/.docker/config.json | jq -r --arg url "${REPOSITORY_URL}" '.auths | has($url)'
}

if [[ "$(is_logged_in)" == "false" ]]; then
  # do stuff, log in
fi
mcw
источник
2
Вы можете jqвернуть правильный код выхода, и тогда вам не нужно будет сравнивать строки:is_logged_in() { jq -e --arg url ${ADDRESS} '.auths | has($url)' ~/.docker/config.json > /dev/null; }; if is_logged_in; then ...
Гасс,
Ницца! Спасибо!
mcw,
1

В Windows вы можете проверить авторизацию (авторизацию) входа в систему, просмотрев этот файл: [USER_HOME_DIR] .docker \ config.json

Пример: c: \ USERS \ YOUR_USERANME.docker \ config.json

Это будет выглядеть примерно так для учетных данных Windows

{
"auths": {
    "HOST_NAME_HERE": {},
    "https://index.docker.io/v1/": {}
},
"HttpHeaders": {
    "User-Agent": "Docker-Client/18.09.0 (windows)"
},
"credsStore": "wincred",
"stackOrchestrator": "swarm"
}
атом88
источник
0

Как указал @Christian, лучше сначала попробовать операцию, а затем войти в систему, только если это необходимо. Проблема в том, что «при необходимости» не так очевидно, что нужно делать надежно. Один из подходов состоит в том, чтобы сравнить stderr операции докера с некоторыми известными строками (методом проб и ошибок). Например,

try "docker OPERATION"
if it failed: 
    capture the stderr of "docker OPERATION"
    if it ends with "no basic auth credentials": 
        try docker login
    else if it ends with "not found":
        fatal error: image name/tag probably incorrect
    else if it ends with <other stuff you care to trap>:
        ...
    else:
        fatal error: unknown cause

try docker OPERATION again
if this fails: you're SOL!
Оливер
источник