Как узнать, что докер уже вошел в систему на сервере реестра докеров
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файл добавляется запись / узел (это также работает для частных реестров) после успешного входа в систему:
$ 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"
Если вы получили результат, подобный приведенному выше, это означает, что logged-in-userуже был активный сеанс с private.registry.com. Если вместо этого вам будет предложено ввести имя пользователя, это будет означать, что нет активного сеанса.
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
Это существует в Windows (используйте Get-Content ~\.docker\config.json), и вы также можете потрогать инструмент учетных данных, в котором также указано имя пользователя ... и я думаю, вы даже можете получить пароль
. "C:\Program Files\Docker\Docker\resources\bin\docker-credential-wincred.exe" list
В 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.
По крайней мере, в «Docker для Windows» вы можете увидеть, вошли ли вы в Docker Hub через пользовательский интерфейс. Просто щелкните правой кнопкой мыши значок докера в области уведомлений Windows:
Вы можете jqвернуть правильный код выхода, и тогда вам не нужно будет сравнивать строки:is_logged_in() { jq -e --arg url ${ADDRESS} '.auths | has($url)' ~/.docker/config.json > /dev/null; }; if is_logged_in; then ...
Гасс,
Ницца! Спасибо!
mcw,
1
Используйте команду, как показано ниже:
docker info | grep 'name'
WARNING: No swap limit support
Username: <strong>jonasm2009</strong>
Как указал @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!
Ответы:
Редактировать 2020
Возвращаясь к ( закрытой ) проблеме github , где указано, что нет фактического сеанса или состояния;
Как указывали другие,
auths
в~/.docker/config.json
файл добавляется запись / узел (это также работает для частных реестров) после успешного входа в систему:При выходе из системы эта запись удаляется:
Содержимое докера
config.json
после:Этот файл может быть проанализирован вашим скриптом или кодом, чтобы проверить ваш статус входа.
Альтернативный метод (повторный вход)
Вы можете войти в докер с помощью
docker login <repository>
Если вы уже вошли в систему, запрос будет выглядеть так:
Для исходного объяснения
~/.docker/config.json
проверьте вопрос: как узнать, вошел ли я в частный реестр докеровисточник
~/.docker/config.json
.docker info
очевидно, ненадежен даже для index.docker.io . В настоящее время авторизован и вижу толькоRegistry
запись, нетUsername
.Я использую один из следующих двух способов для этой проверки:
1: Просмотрите файл config.json:
Если вы вошли в систему на «private.registry.com», вы увидите запись для того же, что и следующее
~/.docker/config.json
:2: попробуйте войти в докер еще раз:
Если вы пытаетесь проверить, есть ли у вас активный сеанс с private.registry.com, попробуйте войти снова:
Если вы получили результат, подобный приведенному выше, это означает, что
logged-in-user
уже был активный сеанс сprivate.registry.com
. Если вместо этого вам будет предложено ввести имя пользователя, это будет означать, что нет активного сеанса.источник
Вы можете выполнить следующую команду, чтобы увидеть имя пользователя, под которым вы вошли в систему, и используемый реестр:
источник
Ответы здесь пока не очень полезны:
docker info
больше не предоставляет эту информациюdocker logout
является серьезным неудобством - если вы еще не знаете учетные данные и можете легко повторно войти в системуdocker login
ответ кажется довольно ненадежным и его не так просто проанализировать программойМое решение, которое сработало для меня, основано на комментарии @ noobuntu : я подумал, что если я уже знаю изображение, которое хочу вытащить, но я не уверен, что пользователь уже вошел в систему, я могу сделать это:
источник
Для частных реестров ничего не отображается в
docker info
. Однако команда выхода сообщит вам, вошли ли вы в систему:(Хотя это заставит вас снова войти в систему.)
источник
Схема учетных данных docker cli неудивительно проста, просто взгляните:
cat ~/.docker/config.json
Это существует в Windows (используйте
Get-Content ~\.docker\config.json
), и вы также можете потрогать инструмент учетных данных, в котором также указано имя пользователя ... и я думаю, вы даже можете получить пароль. "C:\Program Files\Docker\Docker\resources\bin\docker-credential-wincred.exe" list
источник
docker-credential-wincred.exe <store|get|erase|list|version>
это значит, что вы можетеget
cat
псевдоним в Powershell ... обновлен, чтобы включить обаТолько что проверил, сегодня это выглядит так:
ПРИМЕЧАНИЕ: это на macOS с последней версией Docker CE, docker-credential-helper - обе установлены вместе с homebrew.
источник
По крайней мере, в «Docker для Windows» вы можете увидеть, вошли ли вы в Docker Hub через пользовательский интерфейс. Просто щелкните правой кнопкой мыши значок докера в области уведомлений Windows:
источник
Если вы хотите просто
true/false
значение, вы можете трубы вашегоdocker.json
кjq
.источник
jq
вернуть правильный код выхода, и тогда вам не нужно будет сравнивать строки:is_logged_in() { jq -e --arg url ${ADDRESS} '.auths | has($url)' ~/.docker/config.json > /dev/null; }; if is_logged_in; then ...
Используйте команду, как показано ниже:
источник
В Windows вы можете проверить авторизацию (авторизацию) входа в систему, просмотрев этот файл: [USER_HOME_DIR] .docker \ config.json
Пример: c: \ USERS \ YOUR_USERANME.docker \ config.json
Это будет выглядеть примерно так для учетных данных Windows
источник
Как указал @Christian, лучше сначала попробовать операцию, а затем войти в систему, только если это необходимо. Проблема в том, что «при необходимости» не так очевидно, что нужно делать надежно. Один из подходов состоит в том, чтобы сравнить stderr операции докера с некоторыми известными строками (методом проб и ошибок). Например,
источник