ฉันไม่แน่ใจว่าฉันได้ล็อกอินเข้าสู่ Docker Registry ในบรรทัด cmd แล้วหรือยังโดยใช้ cmd: docker login คุณจะทดสอบหรือดูได้อย่างไรว่าคุณเข้าสู่ระบบหรือไม่โดยไม่ต้องพยายามกด
ฉันไม่แน่ใจว่าฉันได้ล็อกอินเข้าสู่ Docker Registry ในบรรทัด cmd แล้วหรือยังโดยใช้ cmd: docker login คุณจะทดสอบหรือดูได้อย่างไรว่าคุณเข้าสู่ระบบหรือไม่โดยไม่ต้องพยายามกด
คำตอบ:
แก้ไขปี 2020
อ้างถึงปัญหาgithub ( ปิด ) ซึ่งถูกชี้ให้เห็นไม่มีเซสชันหรือสถานะที่แท้จริง
การเข้าสู่ระบบนักเทียบท่าไม่ได้สร้างเซสชันแบบถาวร แต่อย่างใดเป็นเพียงการจัดเก็บข้อมูลประจำตัวของผู้ใช้บนดิสก์เพื่อให้เมื่อจำเป็นต้องมีการตรวจสอบสิทธิ์ก็สามารถอ่านเพื่อเข้าสู่ระบบได้
ตามที่คนอื่น ๆ ได้ชี้ให้เห็น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
สำหรับการลงทะเบียนส่วนตัวไม่มีอะไรที่จะแสดงใน อย่างไรก็ตามคำสั่ง logout จะบอกคุณว่าคุณได้เข้าสู่ระบบหรือไม่:
$ docker logout private.example.com
Not logged in to private.example.com
(แม้ว่าจะบังคับให้คุณเข้าสู่ระบบอีกครั้งก็ตาม)
รูปแบบข้อมูลประจำตัวของนักเทียบท่า 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 login
Authenticating with existing credentials...
Login Succeeded
หมายเหตุ: นี่คือบน macOS ที่มี Docker CE เวอร์ชันล่าสุด, ตัวช่วยนักเทียบท่า - หนังสือรับรอง - ทั้งสองติดตั้งกับ homebrew
หากคุณต้องการ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 คุณสามารถตรวจสอบ "การอนุญาต" เข้าสู่ระบบ (auths) ได้โดยดูที่ไฟล์นี้: [USER_HOME_DIR] .docker \ config.json
ตัวอย่าง: c: \ USERS \ YOUR_USERANME.docker \ config.json
จะมีหน้าตาประมาณนี้สำหรับ windows credentials
{
"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!
บิลด์สคริปต์ AWS ECR ของฉันมี:
ECR_HOSTNAME="${ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com"
TOKEN=$(jq -r '.auths["'$ECR_HOSTNAME'"]["auth"]' ~/.docker/config.json)
curl --fail --header "Authorization: Basic $TOKEN" https://$ECR_HOSTNAME/v2/
หากการเข้าถึง ECR ล้มเหลวการเข้าสู่ระบบจะเสร็จสิ้น:
aws ecr get-login-password --region ${REGION} | docker login --username AWS --password-stdin https://$ECR_HOSTNAME
เพื่อให้ได้ผลจึงไม่สามารถใช้ที่เก็บข้อมูลประจำตัวของ Docker ที่เหมาะสมได้ ที่เก็บข้อมูลประจำตัวเริ่มต้น~/.docker/config.json
จะถือว่า