Cách biết docker đã đăng nhập vào máy chủ đăng ký docker chưa


116

Tôi không chắc liệu mình đã đăng nhập vào sổ đăng ký docker trong dòng cmd hay chưa bằng cách sử dụng đăng nhập cmd: docker. Làm thế nào bạn có thể kiểm tra hoặc xem liệu bạn đã đăng nhập hay chưa mà không cần cố gắng đẩy?


Không chắc tôi hiểu câu hỏi của bạn? bạn có muốn biết nếu bạn đã đăng nhập trên một thiết bị đầu cuối? tại sao không chạy lệnh % docker images trong terminal và xem liệu hình ảnh của bạn có hiển thị không?
noobuntu

1
Tôi muốn biết liệu tôi có đăng nhập vào sổ đăng ký dockerhub trong thiết bị đầu cuối hay không. Tôi nghĩ rằng các hình ảnh là cục bộ, vì vậy nó sẽ chỉ hiển thị các hình ảnh cục bộ, không phải các hình ảnh dockerhub.
Ville Miekk-oja

1
Tôi tin rằng khi bạn đã đăng nhập vào docker, bạn đã được kết nối với sổ đăng ký dockerhub của mình. Tôi không nghĩ rằng có một đăng nhập riêng
noobuntu

Câu trả lời:


64

Chỉnh sửa năm 2020

Đề cập lại vấn đề github ( đã đóng ) , nơi nó được chỉ ra, không có phiên hoặc trạng thái thực tế nào;

Đăng nhập docker thực sự không tạo ra bất kỳ loại phiên liên tục nào, nó chỉ lưu trữ thông tin đăng nhập của người dùng trên đĩa để khi yêu cầu xác thực, nó có thể đọc chúng để đăng nhập

Như những người khác đã chỉ ra, một authsmục / nút được thêm vào ~/.docker/config.jsontệp (điều này cũng hoạt động đối với đăng ký riêng tư ) sau khi bạn đăng nhập thành công:

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

Khi đăng xuất, mục này sau đó sẽ bị xóa:

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

Nội dung của docker config.jsonsau:

{
    "auths": {},
    ...

Tệp này có thể được phân tích cú pháp bởi tập lệnh hoặc mã của bạn để kiểm tra trạng thái đăng nhập của bạn.

Phương pháp thay thế (đăng nhập lại)

Bạn có thể đăng nhập vào docker bằng 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:

Nếu bạn đã đăng nhập, lời nhắc sẽ giống như sau:

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

Để có lời giải thích ban đầu cho câu hỏi~/.docker/config.json , hãy kiểm tra : làm cách nào để biết tôi đã đăng nhập vào sổ đăng ký docker riêng tư hay chưa


4
Liên kết cuối cùng nói về việc kiểm tra nội dung của ~/.docker/config.json.
dusan

2
docker inforõ ràng là không đáng tin cậy ngay cả đối với index.docker.io . Hiện tại đã đăng nhập ổn và chỉ thấy Registrymục nhập, không Username.
nổi tiếng

3
thông tin docker không hiển thị Tên người dùng nữa. Tôi đang sử dụng Windows, với phiên bản docker 18.05.0-ce.
Giovanni Bassi

3
Điều gì sẽ xảy ra nếu một tập lệnh cần kiểm tra?
Teekin 07/07/18

Tôi nghĩ rằng điều này chỉ hoạt động cho trung tâm docker chính. Tự động hóa vào bất kỳ repo nào khác, bạn sẽ phải kiểm tra tệp config.json của mình.
duane

43

Tôi sử dụng một trong hai cách sau đây để kiểm tra:

1: Xem tệp config.json:

Trong trường hợp bạn đã đăng nhập vào "private.registry.com", bạn sẽ thấy một mục giống như sau trong ~/.docker/config.json:

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

2: Thử đăng nhập docker một lần nữa:

Nếu bạn đang cố gắng xem liệu bạn đã có một phiên hoạt động với private.registry.com hay chưa, hãy thử đăng nhập lại:

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

Nếu bạn nhận được đầu ra như trên, điều đó có nghĩa là logged-in-userđã có một phiên hoạt động với private.registry.com. Nếu bạn chỉ được nhắc nhập tên người dùng thay thế, điều đó sẽ cho thấy rằng không có phiên hoạt động nào.


13

Bạn có thể thực hiện lệnh sau để xem tên người dùng bạn đã đăng nhập và sổ đăng ký được sử dụng:

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

6

Các câu trả lời ở đây cho đến nay không quá hữu ích:

  • docker info không còn cung cấp thông tin này nữa
  • docker logout là một sự bất tiện lớn - trừ khi bạn đã biết thông tin đăng nhập và có thể dễ dàng đăng nhập lại
  • docker login phản hồi có vẻ khá không đáng tin cậy và chương trình không dễ phân tích cú pháp

Giải pháp phù hợp với tôi được xây dựng dựa trên nhận xét của @ noobuntu : Tôi đã tìm ra rằng nếu tôi đã biết hình ảnh mà tôi muốn kéo, nhưng tôi không chắc liệu người dùng đã đăng nhập hay chưa, tôi có thể thực hiện điều này:

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)

Đây là chiến thuật tốt nhất cho đến nay: chỉ cần thử kéo, nếu nó không thành công thì nó không được đăng nhập (phần còn lại của logic bạn có sẽ tùy thuộc vào từng trường hợp sử dụng, nhưng lần thử đầu tiên có thể áp dụng chung).
Oliver

2
Tuy nhiên, ai đó đã chỉ ra trên github.com/moby/moby/issues/15466 rằng có nhiều lý do dẫn đến lỗi, không chỉ vấn đề đăng nhập, trạng thái thoát docker không cho phép phân biệt lý do thất bại. Nó vẫn tốt hơn các giải pháp khác, nhưng một giải pháp đầy đủ sẽ yêu cầu một bản vá cho docker.
Oliver

5

Đối với đăng ký cá nhân, không có gì được hiển thị trong docker info. Tuy nhiên, lệnh đăng xuất sẽ cho bạn biết nếu bạn đã đăng nhập:

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

(Mặc dù điều này sẽ buộc bạn phải đăng nhập lại.)


5

Không có gì đáng ngạc nhiên là lược đồ thông tin đăng nhập cli của docker không phức tạp, chỉ cần xem:

cat ~/.docker/config.json

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

Điều này tồn tại trên Windows (sử dụng Get-Content ~\.docker\config.json) và bạn cũng có thể xem xét công cụ xác thực cũng liệt kê tên người dùng ... và tôi nghĩ bạn thậm chí có thể lấy lại mật khẩu

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

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

Trên cửa sổ bạn có thể chỉ xem tên người dùng, mật khẩu được lưu trữ trong quản lý thông tin (control panel)
Thorbjørn Ravn Andersen

Tôi đoán tôi sẽ làm hỏng sự ngạc nhiên ... docker-credential-wincred.exe <store|get|erase|list|version>có nghĩa là bạn có thể getmật khẩu của bạn
KCD

Lệnh cat đó nên sử dụng các dấu phân tách đường dẫn linux: cat ~ / .docker / config.json. Điều này có vẻ là một lựa chọn khó đối với một số người, nhưng những người đọc khác có thể chỉ sao chép / dán nó và thử nó, và không dễ dàng nhận ra rằng lỗi "không có tệp hoặc thư mục như vậy" là do điều này. :-)
charlie arehart

@charliearehart bạn đánh giá thấp sự lười biếng của tôi, tôi đang sử dụng catbí danh trong Powershell ... được cập nhật để bao gồm cả hai
KCD

@KCD bạn à. :-) Cảm ơn bạn đã làm rõ.
charlie arehart

4

Vừa được kiểm tra, hôm nay nó trông như thế này:

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

LƯU Ý: đây là trên macOS có phiên bản mới nhất của Docker CE, docker-credential-helper - cả hai đều được cài đặt bằng homebrew.


3

Ít nhất trong "Docker cho Windows", bạn có thể xem liệu mình đã đăng nhập vào trung tâm docker qua giao diện người dùng hay chưa. Chỉ cần nhấp chuột phải vào biểu tượng docker trong khu vực thông báo của windows: Docker đã đăng nhập


1
còn các phiên bản docker không có GUI thì sao? hoặc không phải cửa sổ?
Zameer Fouzan

1
Sau đó, bạn phải sử dụng một trong các cách tiếp cận từ các câu trả lời khác.
BaluJr.

2

Nếu bạn muốn một true/falsegiá trị đơn giản , bạn có thể docker.jsonchuyển sang 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
Bạn có thể jqtrả về một mã thoát thích hợp và sau đó bạn không cần thực hiện so sánh chuỗi:is_logged_in() { jq -e --arg url ${ADDRESS} '.auths | has($url)' ~/.docker/config.json > /dev/null; }; if is_logged_in; then ...
Guss

Đẹp! Cảm ơn bạn!
mcw


1

Trên windows, bạn có thể kiểm tra "ủy quyền" (auths) đăng nhập bằng cách xem tệp này: [USER_HOME_DIR] .docker \ config.json

Ví dụ: c: \ USERS \ YOUR_USERANME.docker \ config.json

Thông tin đăng nhập windows sẽ trông giống như thế này

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

0

Như đã chỉ ra bởi @Christian, tốt nhất hãy thử thao tác trước rồi chỉ đăng nhập nếu cần. Vấn đề là "nếu cần thiết" không phải là hiển nhiên để làm một cách mạnh mẽ. Một cách tiếp cận là so sánh stderr của hoạt động docker với một số chuỗi đã biết (bằng cách thử và sai). Ví dụ,

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!
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.