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?
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?
Câu trả lời:
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 auths
mục / nút được thêm vào ~/.docker/config.json
tệ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.json
sau:
{
"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.
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
~/.docker/config.json
.
docker info
rõ 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 Registry
mục nhập, không Username
.
Tôi sử dụng một trong hai cách sau đây để kiểm tra:
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"
}
}
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.
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'
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ữadocker 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ạidocker 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ápGiả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)
Đố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.)
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"}
docker-credential-wincred.exe <store|get|erase|list|version>
có nghĩa là bạn có thể get
mật khẩu của bạn
cat
bí danh trong Powershell ... được cập nhật để bao gồm cả hai
Í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:
Nếu bạn muốn một true/false
giá trị đơn giản , bạn có thể docker.json
chuyể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
jq
trả 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 ...
Sử dụng lệnh như dưới đây:
docker info | grep 'name'
WARNING: No swap limit support
Username: <strong>jonasm2009</strong>
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"
}
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!