Bagaimana cara mengetahui apakah buruh pelabuhan sudah masuk ke server registri buruh pelabuhan

116

Saya tidak yakin apakah saya sudah masuk ke registri buruh pelabuhan di baris cmd dengan menggunakan cmd: login docker. Bagaimana Anda bisa menguji atau melihat apakah Anda masuk atau tidak, tanpa mencoba mendorong?

Ville Miekk-oja
sumber
Tidak yakin saya mengerti pertanyaan Anda? apakah Anda ingin tahu apakah Anda masuk di terminal? mengapa tidak menjalankan perintah % docker images di terminal dan lihat apakah gambar Anda muncul?
noobuntu
1
Saya ingin tahu apakah saya login ke registry dockerhub di terminal. Saya pikir gambarnya lokal, jadi itu hanya akan menampilkan gambar lokal, bukan gambar dockerhub.
Ville Miekk-oja
1
Saya yakin setelah Anda masuk ke buruh pelabuhan, Anda terhubung ke registri dockerhub Anda. Saya rasa tidak ada login terpisah
noobuntu

Jawaban:

64

Edit 2020

Merujuk kembali ke masalah github ( tertutup ) , yang disebutkan, tidak ada sesi atau status aktual;

docker login sebenarnya tidak membuat sesi persisten apa pun, itu hanya menyimpan kredensial pengguna pada disk sehingga ketika otentikasi diperlukan, ia dapat membacanya untuk masuk

Seperti yang ditunjukkan orang lain, authsentri / node ditambahkan ke ~/.docker/config.jsonfile (ini juga berfungsi untuk registri pribadi ) setelah Anda berhasil masuk:

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

Saat keluar, entri ini kemudian dihapus:

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

Isi buruh pelabuhan config.jsonsetelah:

{
    "auths": {},
    ...

File ini dapat diurai oleh skrip atau kode Anda untuk memeriksa status login Anda.

Metode alternatif (login ulang)

Anda bisa login ke buruh pelabuhan dengan 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:

Jika Anda sudah masuk, prompt akan terlihat seperti ini:

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

Untuk penjelasan asli untuk ~/.docker/config.json, periksa pertanyaan: bagaimana cara mengetahui apakah saya masuk ke registri buruh pelabuhan pribadi

Francesco de Guytenaere
sumber
4
Tautan terakhir berbicara tentang memeriksa konten ~/.docker/config.json.
dusan
3
docker infotampaknya tidak dapat diandalkan bahkan untuk index.docker.io . Saat ini masuk baik-baik saja dan hanya melihat Registryentri, tidak Username.
Famousgarkin
3
info buruh pelabuhan tidak menampilkan nama pengguna lagi. Saya menggunakan Windows, dengan buruh pelabuhan versi 18.05.0-ce.
Giovanni Bassi
3
Bagaimana jika skrip perlu diperiksa?
Teekin
Ini hanya bekerja untuk hub buruh pelabuhan utama, saya kira. Authing ke repo lain, Anda harus memeriksa file config.json Anda.
duane
43

Saya menggunakan salah satu dari dua cara berikut untuk pemeriksaan ini:

1: Lihat file config.json:

Jika Anda masuk ke "private.registry.com", Anda akan melihat entri yang sama seperti berikut di ~/.docker/config.json:

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

2: Coba login buruh pelabuhan sekali lagi:

Jika Anda mencoba untuk melihat apakah Anda sudah memiliki sesi aktif dengan private.registry.com, coba masuk lagi:

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

Jika mendapatkan output seperti di atas, artinya logged-in-usersudah ada sesi aktif dengan private.registry.com. Jika Anda hanya diminta untuk nama pengguna, itu akan menunjukkan bahwa tidak ada sesi aktif.

Arnab
sumber
14

Anda dapat melakukan perintah berikut untuk melihat nama pengguna yang Anda gunakan untuk masuk dan registri yang digunakan:

docker system info | grep -E 'Username|Registry'
Miira ben sghaier
sumber
6

Jawaban di sini sejauh ini tidak begitu berguna:

  • docker info tidak lagi memberikan info ini
  • docker logout merupakan ketidaknyamanan utama - kecuali Anda sudah mengetahui kredensial dan dapat masuk ulang dengan mudah
  • docker login respons tampaknya tidak dapat diandalkan dan tidak begitu mudah diurai oleh program

Solusi saya yang berhasil untuk saya didasarkan pada komentar @ noobuntu : Saya pikir jika saya sudah mengetahui gambar yang ingin saya tarik, tetapi saya tidak yakin apakah pengguna sudah masuk, saya bisa melakukan ini:

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)
Kristen
sumber
Sejauh ini, ini adalah strategi terbaik: coba saja tarik, jika gagal maka ia tidak masuk (logika lainnya yang Anda miliki akan bergantung pada setiap kasus penggunaan, tetapi percobaan pertama dapat diterapkan secara universal).
Oliver
2
Namun seseorang menunjukkan di github.com/moby/moby/issues/15466 bahwa ada banyak alasan kegagalan, bukan hanya masalah login, namun status keluar buruh pelabuhan tidak memungkinkan untuk membedakan alasan kegagalan. Ini masih lebih baik daripada solusi lain, tetapi solusi lengkap akan membutuhkan patch untuk buruh pelabuhan.
Oliver
5

Untuk registri pribadi, tidak ada yang ditampilkan di docker info. Namun, perintah logout akan memberi tahu Anda jika Anda masuk:

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

(Meskipun ini akan memaksa Anda untuk masuk lagi.)

Wilfred Hughes
sumber
5

Skema kredensial CLI buruh pelabuhan ternyata tidak rumit, lihat saja:

cat ~/.docker/config.json

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

Ini ada di Windows (gunakan Get-Content ~\.docker\config.json) dan Anda juga dapat melihat-lihat alat kredensial yang juga mencantumkan nama pengguna ... dan saya pikir Anda bahkan dapat mengambil kata sandi

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

{"https://index.docker.io/v1/":"kcd"}
KCD
sumber
Di windows Anda hanya dapat melihat nama pengguna, kata sandi disimpan di pengelola kredensial (panel kontrol)
Thorbjørn Ravn Andersen
Saya kira saya akan merusak kejutan ... docker-credential-wincred.exe <store|get|erase|list|version>yang berarti Anda dapat getkata sandi Anda
KCD
Perintah cat itu harus menggunakan pemisah jalur linux: cat ~ / .docker / config.json. Hal ini mungkin tampak tidak menyenangkan bagi sebagian orang, tetapi pembaca lain mungkin hanya menyalin / menempelkannya dan mencobanya, dan tidak langsung menyadari bahwa kesalahan "tidak ada file atau direktori seperti itu" disebabkan oleh hal ini. :-)
Charlie Arehart
@charliearehart Anda meremehkan kemalasan saya, saya menggunakan catalias di Powershell ... diperbarui untuk menyertakan keduanya
KCD
@KCD, ah. :-) Terima kasih telah menjelaskan.
Charlie Arehart
4

Baru diperiksa, hari ini terlihat seperti ini:

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

CATATAN: ini di macOS dengan versi terbaru Docker CE, docker-credential-helper - keduanya diinstal dengan homebrew.

todd_dsm
sumber
3

Setidaknya di "Docker untuk Windows" Anda dapat melihat apakah Anda masuk ke hub buruh pelabuhan melalui UI. Cukup klik kanan ikon buruh pelabuhan di area pemberitahuan windows: Docker Masuk

BaluJr.
sumber
1
bagaimana dengan versi buruh pelabuhan tanpa GUI? atau bukan jendela?
Zameer Fouzan
1
Kemudian Anda harus menggunakan salah satu pendekatan dari jawaban lainnya.
BaluJr.
2

Jika Anda menginginkan true/falsenilai yang sederhana , Anda dapat menyalurkan docker.jsonke 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
mcw
sumber
2
Anda dapat jqmengembalikan kode keluar yang benar dan kemudian Anda tidak perlu melakukan perbandingan string:is_logged_in() { jq -e --arg url ${ADDRESS} '.auths | has($url)' ~/.docker/config.json > /dev/null; }; if is_logged_in; then ...
Guss
Bagus! Terima kasih!
mcw
1

Gunakan perintah seperti di bawah ini:

docker info | grep 'name'

WARNING: No swap limit support
Username: <strong>jonasm2009</strong>
Meng Jonas
sumber
Jika Anda sudah masuk ke registri buruh pelabuhan, cukup gunakan ! [Masukkan deskripsi gambar di sini ] ( i.stack.imgur.com/JkCxn.png ) Anda akan melihat jawabannya.
Meng Jonas
1

Di windows Anda dapat memeriksa login "otorisasi" (auth) dengan melihat file ini: [USER_HOME_DIR] .docker \ config.json

Contoh: c: \ USERS \ YOUR_USERANME.docker \ config.json

Ini akan terlihat seperti ini untuk kredensial windows

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

Seperti yang ditunjukkan oleh @Christian, yang terbaik adalah mencoba operasi terlebih dahulu lalu login hanya jika perlu. Masalahnya adalah bahwa "jika perlu" tidak begitu jelas untuk dilakukan dengan kuat. Salah satu pendekatannya adalah dengan membandingkan stderr dari operasi buruh pelabuhan dengan beberapa string yang dikenal (dengan trial and error). Sebagai contoh,

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!
Oliver
sumber