Я не уверен, что я уже вошел в реестр докеров в строке cmd, используя cmd: docker login. Как вы можете проверить или увидеть, вошли ли вы в систему или нет, не пытаясь нажать?
Я не уверен, что я уже вошел в реестр докеров в строке cmd, используя cmd: docker login. Как вы можете проверить или увидеть, вошли ли вы в систему или нет, не пытаясь нажать?
Ответы:
Редактировать 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
проверьте вопрос: как узнать, вошел ли я в частный реестр докеров
~/.docker/config.json
.
docker info
очевидно, ненадежен даже для index.docker.io . В настоящее время авторизован и вижу только Registry
запись, нет Username
.
Я использую один из следующих двух способов для этой проверки:
Если вы вошли в систему на «private.registry.com», вы увидите запись для того же, что и следующее ~/.docker/config.json
:
"auths": {
"private.registry.com": {
"auth": "gibberishgibberishgibberishgibberishgibberishgibberish"
}
}
Если вы пытаетесь проверить, есть ли у вас активный сеанс с private.registry.com, попробуйте войти снова:
bash$ docker login private.registry.com
Username (logged-in-user):
Если вы получили результат, подобный приведенному выше, это означает, что logged-in-user
уже был активный сеанс с private.registry.com
. Если вместо этого вам будет предложено ввести имя пользователя, это будет означать, что нет активного сеанса.
Вы можете выполнить следующую команду, чтобы увидеть имя пользователя, под которым вы вошли в систему, и используемый реестр:
docker system info | grep -E 'Username|Registry'
Ответы здесь пока не очень полезны:
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)
Для частных реестров ничего не отображается в docker info
. Однако команда выхода сообщит вам, вошли ли вы в систему:
$ docker logout private.example.com
Not logged in to private.example.com
(Хотя это заставит вас снова войти в систему.)
Схема учетных данных 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"}
docker-credential-wincred.exe <store|get|erase|list|version>
это значит, что вы можете get
cat
псевдоним в Powershell ... обновлен, чтобы включить оба
По крайней мере, в «Docker для Windows» вы можете увидеть, вошли ли вы в Docker Hub через пользовательский интерфейс. Просто щелкните правой кнопкой мыши значок докера в области уведомлений Windows:
Если вы хотите просто 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
jq
вернуть правильный код выхода, и тогда вам не нужно будет сравнивать строки:is_logged_in() { jq -e --arg url ${ADDRESS} '.auths | has($url)' ~/.docker/config.json > /dev/null; }; if is_logged_in; then ...
Используйте команду, как показано ниже:
docker info | grep 'name'
WARNING: No swap limit support
Username: <strong>jonasm2009</strong>
В 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"
}
Как указал @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!