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


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"}

В 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.


3

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


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

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"
}

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!
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.