จะทราบได้อย่างไรว่านักเทียบท่าล็อกอินเข้าสู่เซิร์ฟเวอร์รีจิสทรีนักเทียบท่าแล้ว


123

ฉันไม่แน่ใจว่าฉันได้ล็อกอินเข้าสู่ Docker Registry ในบรรทัด cmd แล้วหรือยังโดยใช้ cmd: docker login คุณจะทดสอบหรือดูได้อย่างไรว่าคุณเข้าสู่ระบบหรือไม่โดยไม่ต้องพยายามกด


ไม่แน่ใจว่าฉันเข้าใจคำถามของคุณหรือไม่ คุณต้องการทราบว่าคุณลงชื่อเข้าใช้เครื่องปลายทางหรือไม่? ทำไมไม่เรียกใช้คำสั่ง% docker imagesในเทอร์มินัลและดูว่ารูปภาพของคุณปรากฏขึ้นหรือไม่
noobuntu

1
ฉันต้องการทราบว่าฉันล็อกอินเข้า Dockerhub Registry ในเทอร์มินัลหรือไม่ ฉันคิดว่าภาพนั้นเป็นภาพในพื้นที่ดังนั้นมันจะแสดงเฉพาะภาพในเครื่องเท่านั้นไม่ใช่ภาพ Dockerhub
Ville Miekk-oja

1
ฉันเชื่อว่าเมื่อคุณลงชื่อเข้าใช้ Docker แล้วคุณจะเชื่อมต่อกับรีจิสทรีของ Dockerhub ฉันไม่คิดว่าจะมีการเข้าสู่ระบบแยกต่างหาก
noobuntu

คำตอบ:


69

แก้ไขปี 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โปรดตรวจสอบ: ฉันจะทราบได้อย่างไรว่าฉันเข้าสู่ระบบลงทะเบียนนักเทียบท่าส่วนตัว


4
ลิงค์สุดท้ายพูดถึงการตรวจสอบเนื้อหาของ~/.docker/config.json.
dusan

3
docker infoเห็นได้ชัดว่าไม่น่าเชื่อถือแม้สำหรับindex.docker.io ขณะนี้เข้าสู่ระบบไม่เป็นไรและเห็นเฉพาะรายการไม่มีRegistry Username
famousgarkin

3
ข้อมูลนักเทียบท่าไม่แสดงชื่อผู้ใช้อีกต่อไป ฉันใช้ Windows โดยใช้ Docker เวอร์ชัน 18.05.0-ce
Giovanni Bassi

3
จะเกิดอะไรขึ้นหากสคริปต์ต้องตรวจสอบ
Teekin

ฉันคิดว่าสิ่งนี้ใช้ได้กับฮับนักเทียบท่าหลักเท่านั้น การตรวจสอบสิทธิ์ repo อื่น ๆ คุณจะต้องตรวจสอบไฟล์ config.json ของคุณ
duane

43

ฉันใช้หนึ่งในสองวิธีต่อไปนี้สำหรับการตรวจสอบนี้:

1: ดูไฟล์ config.json:

ในกรณีที่คุณเข้าสู่ระบบ "private.registry.com" คุณจะเห็นรายการดังต่อไปนี้~/.docker/config.json:

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

2: ลองเข้าสู่ระบบนักเทียบท่าอีกครั้ง:

หากคุณกำลังพยายามดูว่าคุณมีเซสชันที่ใช้งานอยู่กับ private.registry.com หรือไม่ให้ลองเข้าสู่ระบบอีกครั้ง:

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

ถ้าคุณได้รับการส่งออกเช่นที่กล่าวมานั้นหมายถึงการอยู่แล้วมีเซสชั่นที่ใช้งานกับlogged-in-user private.registry.comหากคุณได้รับแจ้งให้ป้อนชื่อผู้ใช้แทนนั่นแสดงว่าไม่มีเซสชันที่ใช้งานอยู่


14

คุณสามารถทำคำสั่งต่อไปนี้เพื่อดูชื่อผู้ใช้ที่คุณเข้าสู่ระบบและรีจิสทรีที่ใช้:

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

6

คำตอบที่นี่ไม่มีประโยชน์มากนัก:

  • 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)

นี่เป็นขั้นตอนที่ดีที่สุด: เพียงแค่ลองดึงหากล้มเหลวแสดงว่าไม่ได้เข้าสู่ระบบ (ตรรกะที่เหลือที่คุณมีจะขึ้นอยู่กับแต่ละกรณีการใช้งาน แต่การลองครั้งแรกสามารถใช้ได้ทั่วโลก)
Oliver

2
อย่างไรก็ตามมีคนชี้ให้เห็นในgithub.com/moby/moby/issues/15466ว่ามีสาเหตุหลายประการสำหรับความล้มเหลวไม่ใช่แค่ปัญหาการเข้าสู่ระบบ แต่สถานะการออกจากนักเทียบท่าไม่อนุญาตให้แยกแยะเหตุผลของความล้มเหลว ยังดีกว่าโซลูชันอื่น ๆ แต่โซลูชันเต็มรูปแบบจะต้องใช้แพทช์สำหรับนักเทียบท่า
Oliver

5

docker infoสำหรับการลงทะเบียนส่วนตัวไม่มีอะไรที่จะแสดงใน อย่างไรก็ตามคำสั่ง logout จะบอกคุณว่าคุณได้เข้าสู่ระบบหรือไม่:

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

(แม้ว่าจะบังคับให้คุณเข้าสู่ระบบอีกครั้งก็ตาม)


5

รูปแบบข้อมูลประจำตัวของนักเทียบท่า 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"}

บน windows คุณสามารถเห็นเฉพาะชื่อผู้ใช้รหัสผ่านจะถูกเก็บไว้ในตัวจัดการข้อมูลรับรอง (แผงควบคุม)
Thorbjørn Ravn Andersen

ฉันเดาว่าฉันจะเสียความประหลาดใจ ... docker-credential-wincred.exe <store|get|erase|list|version>ซึ่งหมายความว่าคุณสามารถgetรหัสผ่านของคุณได้
KCD

คำสั่ง cat นั้นควรใช้ตัวคั่นพา ธ linux: cat ~ / .docker / config.json สิ่งนี้อาจดูเหมือนเป็นการเลือกที่ไม่ถูกต้องสำหรับบางคน แต่ผู้อ่านคนอื่น ๆ อาจเพียงแค่คัดลอก / วางและลองใช้งานและไม่ทราบทันทีว่าเกิดข้อผิดพลาด "ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว" :-)
charlie arehart

@charliearehart คุณดูถูกความขี้เกียจของฉันฉันใช้catนามแฝงใน Powershell ... อัปเดตเพื่อรวมทั้งสองอย่าง
KCD

@KCD อ่า :-) ขอบคุณสำหรับการชี้แจง
charlie arehart

4

เพิ่งตรวจสอบวันนี้ดูเหมือนว่า:

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

หมายเหตุ: นี่คือบน macOS ที่มี Docker CE เวอร์ชันล่าสุด, ตัวช่วยนักเทียบท่า - หนังสือรับรอง - ทั้งสองติดตั้งกับ homebrew


3

อย่างน้อยใน "Docker for Windows" คุณสามารถดูได้ว่าคุณล็อกอินเข้าสู่ Docker hub ผ่าน UI หรือไม่ เพียงคลิกขวาที่ไอคอน Docker ในพื้นที่แจ้งเตือนของ windows: Docker เข้าสู่ระบบ


1
แล้วนักเทียบท่ารุ่นที่ไม่มี GUI ล่ะ? หรือไม่ใช่ windows?
Zameer Fouzan

1
จากนั้นคุณต้องใช้วิธีใดวิธีหนึ่งจากคำตอบอื่น ๆ
BaluJr.

2

หากคุณต้องการ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

2
คุณสามารถjqส่งคืนรหัสทางออกที่เหมาะสมจากนั้นคุณไม่จำเป็นต้องทำการเปรียบเทียบสตริง:is_logged_in() { jq -e --arg url ${ADDRESS} '.auths | has($url)' ~/.docker/config.json > /dev/null; }; if is_logged_in; then ...
Guss

ดี! ขอบคุณ!
mcw


1

บน 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"
}

0

ตามที่ระบุไว้โดย @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!

0

บิลด์สคริปต์ 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จะถือว่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.