Як дізнатися, чи докер уже ввійшов на сервер реєстру докера


116

Я не впевнений, чи вже я ввійшов до реєстру докера в рядку cmd за допомогою входу cmd: docker. Як ви можете перевірити чи побачити, увійшли ви чи ні, не намагаючись натиснути?


Не впевнений, що я розумію ваше запитання? Ви хочете знати, чи Ви увійшли в термінал? чому б не запустити команду % docker images в терміналі і не перевірити, чи відображаються ваші зображення?
noobuntu

1
Я хочу знати, чи я ввійшов до реєстру dockerhub в терміналі. Я думав, що зображення є локальними, тому вони будуть просто показувати локальні зображення, а не зображення докербуда.
Ville Miekk-oja

1
Я вважаю, що після входу в docker ви підключитесь до свого реєстру dockerhub. Я не думаю, що є окремий логін
noobuntu

Відповіді:


64

Редагувати 2020 рік

Повертаючись до ( закритого ) випуску github , де зазначено, немає фактичного сеансу чи стану;

вхід докера фактично не створює будь-якого стійкого сеансу, він лише зберігає облікові дані користувача на диску, щоб, коли потрібна автентифікація, він міг прочитати їх для входу

Як зазначали інші, 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

2
docker infoмабуть, ненадійний навіть для index.docker.io . Наразі зареєстровано в порядку і бачити лише Registryзапис, ні Username.
знаменитийГаркін

3
інформація про докер більше не відображає ім'я користувача. Я в Windows, з docker версією 18.05.0-ce.
Джованні Бассі

3
Що робити, якщо сценарій потрібно перевірити?
Тікін

Думаю, це працює лише для основного докерного хабу. Авторизуючись до будь-якого іншого репо, вам доведеться перевірити файл 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. Якщо натомість буде запропоновано ввести ім'я користувача, це вказує на відсутність активного сеансу.


13

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

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)

Це, безумовно, найкраща стратегія: просто спробуйте витягнути, якщо вона не вдасться, вона не входить у систему (решта логіки, яку ви маєте, буде залежати від кожного випадку використання, але перша спроба універсальна).
Олівер

2
Однак хтось вказував на github.com/moby/moby/isissue/15466, що є багато причин відмови, а не лише вхід у систему, але статус виходу докера не дозволяє диференціювати причину відмови. Це все-таки краще, ніж інші рішення, але для повного рішення потрібен патч для докера.
Олівер

5

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

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

(Хоча це змусить вас знову увійти.)


5

Схема облікових даних докер-клі не дивно проста, просто подивіться:

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. Деяким це може здатися вибору ниткою, але інші читачі можуть просто скопіювати / вставити його та спробувати, а не зрозуміти, що помилка "немає такого файлу чи каталогу" пов'язана з цим. :-)
Чарлі Арехарт

@charliearehart ви недооцінюєте мою лінь, я використовував catпсевдонім у Powershell ... оновлено, щоб включити і те, і інше
KCD

@KCD, ах. :-) Дякую за уточнення.
Charlie arehart

4

Щойно перевірено, сьогодні це виглядає приблизно так:

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

ПРИМІТКА: це на macOS з останньою версією Docker CE, докер-довірителя-помічника - обидві встановлені з домашньою мовою.


3

Принаймні, в "Docker для Windows" ви можете побачити, чи ви увійшли до док-центру через інтерфейс користувача. Просто клацніть правою кнопкою миші піктограму докера в області сповіщень Windows: Докер увійшов


1
що з докерними версіями без графічного інтерфейсу? чи не вікна?
Замер Фузан

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

Приємно! Дякую!
mcw


1

У Windows ви можете перевірити "авторизацію" (auths) для входу, переглянувши цей файл: [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, найкраще спробувати спершу операцію, а потім увійти лише за потреби. Проблема полягає в тому, що "при необхідності" це не так очевидно, щоб зробити це надійно. Один із підходів полягає в порівнянні більш жорсткого рівня операції докера з деякими відомими рядками (методом проб і помилок). Наприклад,

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.