Docker'ın bir docker kayıt sunucusunda zaten oturum açıp açmadığını nasıl anlarsınız?


118

Cmd: docker girişini kullanarak cmd satırında bir docker kayıt defterinde oturum açıp açmadığımdan emin değilim. Basmaya çalışmadan oturum açıp açmadığınızı nasıl test edebilir veya görebilirsiniz?


Sorunuzu anladığımdan emin değil misiniz? bir terminalde oturum açıp açmadığınızı bilmek ister misiniz? neden terminalde % docker images komutunu çalıştırıp resimlerinizin görünüp görünmediğine bakmıyorsunuz ?
noobuntu

1
Terminalde dockerhub kayıt defterinde oturum açıp açmadığımı bilmek istiyorum. Görüntülerin yerel olduğunu düşündüm, bu yüzden dockerhub görüntülerini değil, sadece yerel görüntüleri gösterecek.
Ville Miekk-oja

1
Docker'da oturum açtığınızda dockerhub kayıt defterinize bağlandığınıza inanıyorum. Ayrı bir giriş olduğunu sanmıyorum
noobuntu

Yanıtlar:


65

2020'yi Düzenle

Belirtildiği yerde ( kapalı ) github konusuna geri dönersek , gerçek bir oturum veya durum yoktur;

docker oturum açma aslında herhangi bir kalıcı oturum oluşturmuyor, yalnızca kullanıcının kimlik bilgilerini diskte depoluyor, böylece kimlik doğrulama gerektiğinde oturum açmak için okuyabilir

Başkalarının da belirttiği gibi, başarılı bir şekilde oturum açtıktan sonra dosyaya bir authsgiriş / düğüm eklenir ~/.docker/config.json(bu aynı zamanda özel kayıtlar için de geçerlidir ):

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

Oturumu kapatırken, bu giriş daha sonra kaldırılır:

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

Daha config.jsonsonra docker içeriği :

{
    "auths": {},
    ...

Bu dosya, oturum açma durumunuzu kontrol etmek için komut dosyanız veya kodunuzla ayrıştırılabilir.

Alternatif yöntem (yeniden giriş)

Docker'a giriş yapabilirsiniz 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:

Zaten giriş yaptıysanız, komut istemi şöyle görünecektir:

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

Sorunun orijinal açıklaması için şu soruyu~/.docker/config.json kontrol edin : Özel bir docker kayıt defterinde oturum açıp açmadığımı nasıl anlarım


4
Son bağlantı, içeriğini kontrol etmekten bahsediyor ~/.docker/config.json.
dusan

3
docker infoindex.docker.io için bile güvenilir olmadığı anlaşılıyor . Şu anda giriş yaptınız ve sadece Registrygirişi görün, hayır Username.
Famousgarkin

3
docker bilgisi artık Kullanıcı adını göstermiyor. Docker sürüm 18.05.0-ce ile Windows kullanıyorum.
Giovanni Bassi

3
Ya bir komut dosyasının kontrol edilmesi gerekiyorsa?
Teekin

Sanırım bu yalnızca ana docker hub için çalışıyor. Herhangi bir başka depoya otomatik olarak config.json dosyanızı kontrol etmeniz gerekir.
duane

43

Bu kontrol için aşağıdaki iki yoldan birini kullanıyorum:

1: config.json dosyasını görüntüleyin:

"Private.registry.com" adresinde oturum açmanız durumunda, aşağıdakine benzer bir giriş göreceksiniz ~/.docker/config.json:

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

2: Docker oturumunu bir kez daha deneyin:

Private.registry.com ile halihazırda aktif bir oturumunuz olup olmadığını görmeye çalışıyorsanız, tekrar oturum açmayı deneyin:

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

Yukarıdaki gibi bir çıktı alırsanız, logged-in-userzaten aktif bir oturumunuz olduğu anlamına gelir private.registry.com. Bunun yerine sadece kullanıcı adı istenirse, bu aktif oturum olmadığını gösterir.


14

Oturum açtığınız kullanıcı adını ve kullanılan kayıt defterini görmek için aşağıdaki komutu uygulayabilirsiniz:

docker system info | grep -E 'Username|Registry'

6

Buradaki cevaplar şu ana kadar pek kullanışlı değil:

  • docker info artık bu bilgiyi sağlamıyor
  • docker logout önemli bir rahatsızlıktır - kimlik bilgilerini zaten bilmiyorsanız ve kolayca yeniden giriş yapamıyorsanız
  • docker login yanıt oldukça güvenilmez görünüyor ve program tarafından ayrıştırılması o kadar kolay değil

Benim için işe yarayan çözümüm @ noobuntu'nun yorumuna dayanıyor : Çekmek istediğim görüntüyü zaten biliyorsam, ancak kullanıcının zaten oturum açmış olup olmadığından emin değilim, bunu yapabileceğimi anladım:

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)

Bu açık arayla en iyi stratejidir: sadece çekmeyi deneyin, başarısız olursa oturum açılmaz (sahip olduğunuz mantığın geri kalanı her kullanım durumuna bağlı olacaktır, ancak ilk deneme evrensel olarak uygulanabilir).
Oliver

2
Bununla birlikte, birisi github.com/moby/moby/issues/15466 adresinde , sadece oturum açma sorunu değil, başarısızlık için birçok neden olduğunu, ancak docker çıkış durumunun, başarısızlık nedenini ayırt etmeye izin vermediğini belirtti. Hala diğer çözümlerden daha iyi, ancak tam bir çözüm, docker için bir yama gerektirecektir.
Oliver

5

Özel kayıtlar için hiçbir şey gösterilmez docker info. Ancak, logout komutu size oturum açıp açmadığınızı söyleyecektir:

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

(Yine de bu sizi tekrar giriş yapmaya zorlayacaktır.)


5

Docker cli kimlik bilgileri şeması şaşırtıcı derecede karmaşık değildir, sadece bir göz atın:

cat ~/.docker/config.json

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

Bu, Windows'ta mevcuttur (kullanım Get-Content ~\.docker\config.json) ve ayrıca kullanıcı adını da listeleyen kimlik bilgisi aracının etrafından dolaşabilirsiniz ... ve bence şifreyi bile alabilirsiniz

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

{"https://index.docker.io/v1/":"kcd"}

Windows'ta yalnızca kullanıcı adını görebilirsiniz, şifre kimlik bilgileri yöneticisinde (kontrol paneli) saklanır
Thorbjørn Ravn Andersen

Sanırım sürprizi mahvedeceğim ... docker-credential-wincred.exe <store|get|erase|list|version>bu da getşifrenizi alabileceğiniz anlamına geliyor
KCD

Bu cat komutu linux yol ayırıcılarını kullanmalıdır: cat ~ / .docker / config.json. Bu, bazıları için bir nit-pick gibi görünebilir, ancak diğer okuyucular bunu kopyalayıp / yapıştırıp deneyebilir ve "böyle bir dosya veya dizin yok" hatasının bundan kaynaklandığını hemen anlayamayabilir. :-)
charlie arehart

@charliearehart tembelliğimi hafife alıyorsun cat, Powershell'de takma adı kullanıyordum ... ikisini de içerecek şekilde güncellendi
KCD

@KCD, ah. :-) Açıkladığınız için teşekkürler.
charlie arehart

4

Az önce kontrol ettim, bugün şöyle görünüyor:

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

NOT: Bu, her ikisi de homebrew ile yüklenen Docker CE'nin en son sürümü olan docker-credential-helper olan bir macOS üzerindedir.


3

En azından "Windows için Docker" da, UI üzerinden docker hub'da oturum açıp açmadığınızı görebilirsiniz. Windows bildirim alanındaki docker simgesine sağ tıklayın: Docker Oturum Açıldı


1
GUI'siz docker sürümleri ne olacak? penceresiz mi?
Zameer Fouzan

1
Öyleyse diğer cevaplardan gelen yaklaşımlardan birini kullanmalısınız.
BaluJr.

2

Basit bir true/falsedeğer istiyorsanız , istediğiniz docker.jsonyere yönlendirebilirsiniz 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
Sen olabilir jquygun bir çıkış kodunu döndürür ve daha sonra dize karşılaştırmaları yapmak gerekmez:is_logged_in() { jq -e --arg url ${ADDRESS} '.auths | has($url)' ~/.docker/config.json > /dev/null; }; if is_logged_in; then ...
Guss

Güzel! Teşekkür ederim!
mcw


1

Windows'ta şu dosyaya bakarak oturum açma "yetkilerini" (yetkilendirmeleri) inceleyebilirsiniz: [USER_HOME_DIR] .docker \ config.json

Örnek: c: \ USERS \ YOUR_USERANME.docker \ config.json

Windows kimlik bilgileri için böyle bir şeye benzeyecek

{
"auths": {
    "HOST_NAME_HERE": {},
    "https://index.docker.io/v1/": {}
},
"HttpHeaders": {
    "User-Agent": "Docker-Client/18.09.0 (windows)"
},
"credsStore": "wincred",
"stackOrchestrator": "swarm"
}

0

@Christian'ın belirttiği gibi, en iyisi önce işlemi denemek ve ardından sadece gerekirse oturum açmaktır. Sorun şu ki, "gerekirse" sağlam bir şekilde yapmak o kadar açık değil. Bir yaklaşım, docker işleminin stderrini bilinen bazı dizelerle (deneme yanılma yoluyla) karşılaştırmaktır. Örneğin,

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!
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.