2016-06-16 8 views
6

docker push करते समय या कोई छवि खींचते समय, डॉकर निर्धारित करता है कि छवि नाम में कोई रजिस्ट्री सर्वर है या यदि यह डिफ़ॉल्ट रजिस्ट्री (जैसे डॉकर हब) पर पथ/उपयोगकर्ता नाम है?डॉकर छवि नाम कैसे पार्स किए जाते हैं?

मैं दिखाई दे रही है 1.1 image spec से निम्नलिखित:

टैग

एक टैग किसी एक छवि आईडी के लिए एक वर्णनात्मक, उपयोगकर्ता के दिए गए नाम मैप करने के लिए कार्य करता है। टैग मान वर्णों के सेट तक सीमित हैं [ए-जेए-जेडएक्स -9]।

भंडार

एक आम उपसर्ग के अंतर्गत वर्गीकृत टैग का एक संग्रह (:) पहले नाम घटक । उदाहरण के लिए, नाम my-app नाम से चित्रित एक छवि में: 3.1.4, मेरा-ऐप नाम का रिपोजिटरी घटक है। एक रिपोजिटरी नाम स्लैश-पृथक नाम घटकों से बना है, वैकल्पिक रूप से DNS होस्टनाम द्वारा उपसर्ग किया गया है। होस्टनाम को मानक DNS नियमों का पालन करना होगा, लेकिन इसमें _ वर्ण नहीं हो सकते हैं। यदि कोई होस्टनाम मौजूद है, तो यह वैकल्पिक रूप से प्रारूप में पोर्ट नंबर के बाद हो सकता है: 8080। नाम घटकों में लोअरकेस वर्ण, अंक और विभाजक हो सकते हैं। विभाजक को एक अवधि, एक या दो अंडरस्कोर, या एक या अधिक डैश के रूप में परिभाषित किया गया है। एक नाम घटक एक विभाजक के साथ शुरू या समाप्त नहीं हो सकता है।

DNS होस्ट नाम के लिए, क्या इसे डॉट्स के साथ पूरी तरह योग्यता प्राप्त करने की आवश्यकता है, या "मेरा-स्थानीय-सर्वर" एक वैध रजिस्ट्री होस्टनाम है? नाम घटकों के लिए, मैं अवधि को वैध मान रहा हूं, जिसका अर्थ है "team.user/appserver" मान्य छवि नाम है। यदि रजिस्ट्री सर्वर पोर्ट 80 पर चल रहा है, और इसलिए छवि नाम में होस्टनाम पर कोई पोर्ट नंबर आवश्यक नहीं है, ऐसा लगता है कि होस्टनाम और रजिस्ट्री सर्वर पर पथ के बीच अस्पष्टता होगी। मैं उत्सुक हूं कि डॉकर उस अस्पष्टता को कैसे हल करता है।

उत्तर

3

टी एल; डॉ: होस्ट नाम पहले / से पहले एक . DNS विभाजक या एक : बंदरगाह विभाजक शामिल होना चाहिए, अन्यथा कोड मानता है कि आपके डिफ़ॉल्ट रजिस्ट्री चाहते हैं।


कुछ कोड के माध्यम से खुदाई के बाद, मैं निम्नलिखित के साथ distribution/reference/reference.go भर में आया था:

// Grammar 
// 
// reference      := name [ ":" tag ] [ "@" digest ] 
// name       := [hostname '/'] component ['/' component]* 
// hostname      := hostcomponent ['.' hostcomponent]* [':' port-number] 
// hostcomponent     := /([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])/ 
// port-number      := /[0-9]+/ 
// component      := alpha-numeric [separator alpha-numeric]* 
// alpha-numeric     := /[a-z0-9]+/ 
// separator      := /[_.]|__|[-]*/ 
// 
// tag        := /[\w][\w.-]{0,127}/ 
// 
// digest       := digest-algorithm ":" digest-hex 
// digest-algorithm    := digest-algorithm-component [ digest-algorithm-separator digest-algorithm-component ] 
// digest-algorithm-separator  := /[+.-_]/ 
// digest-algorithm-component  := /[A-Za-z][A-Za-z0-9]*/ 
// digest-hex      := /[0-9a-fA-F]{32,}/ ; At least 128 bit digest value 

इस बात का वास्तविक क्रियान्वयन distribution/reference/regexp.go में एक regex के माध्यम से है।

लेकिन कुछ खुदाई और पोकिंग के साथ, मैंने पाया कि उस रेगेक्स से परे एक और जांच है (यदि आप . या : शामिल नहीं करते हैं तो आपको अपरकेस होस्टनाम के साथ त्रुटियां मिलेंगी)। और मैं docker/reference.go में निम्न के नाम की वास्तविक विभाजन नीचे ट्रैक किया गया:

func splitHostname(name string) (hostname, remoteName string) { 
    i := strings.IndexRune(name, '/') 
    if i == -1 || (!strings.ContainsAny(name[:i], ".:") && name[:i] != "localhost") { 
     hostname, remoteName = DefaultHostname, name 
    } else { 
     hostname, remoteName = name[:i], name[i+1:] 
    } 
    if hostname == LegacyDefaultHostname { 
     hostname = DefaultHostname 
    } 
    if hostname == DefaultHostname && !strings.ContainsRune(remoteName, '/') { 
     remoteName = DefaultRepoPrefix + remoteName 
    } 
    return 
} 

कि मेरे लिए की महत्वपूर्ण हिस्सा पहले अगर बयान में पहली / से पहले . और : के लिए चेक है।इसके साथ, होस्टनाम को पहले / से पहले विभाजित किया गया है, और इसके बिना, पूरा नाम डिफ़ॉल्ट रजिस्ट्री होस्टनाम में भेज दिया गया है।

+0

हैं के अनुसार छवि विशिष्ट जानकारी टैग 127 वर्ण तक सीमित है। तो मुझे लगता है कि टैग रेगेक्स होना चाहिए /[\w][\w.- ]{0,126}/ –

+0

रेगेक्स लंबाई 127 वर्णों में 0 है, इसलिए मुझे लगता है कि यह सही है। यदि नहीं, तो यह बदलने के लिए पीआर होगा: https://github.com/docker/distribution/blob/master/reference/regexp.go#L37 – BMitch

+0

यहां जिस तरह से मुझे लगता है .... रेगेक्स शुरू होता है [/w ][\w.- ]{0,127} और कोई नहीं है के बीच [ ]। तो इसका मतलब है ए/डब्ल्यू से मेल खाता है और फिर 127 \ डब्ल्यू या डॉट या हाइफ़न से मेल खाता है। कोशिश कर रहा है /^([\w][\w.- ]{0,4})$/.match('ssss- ') रुबी के आईआरबी में पुष्टि करता है कि 5 पात्रों का उपभोग किया जाता है ... –

0

https://github.com/moby/moby/blob/master/image/spec/v1.1.md पर छवि-spec अब यह कहने के लिए अपडेट किया गया है कि टैग 128 वर्णों तक सीमित हैं।

पीआर धागा यहाँ https://github.com/docker/distribution/issues/2248

कुछ रूबी कोड यहाँ है https://github.com/cyber-dojo/runner/blob/master/server/src/valid_image_name.rb

है कुछ रूबी परीक्षण यहां https://github.com/cyber-dojo/runner/blob/master/server/test/src/valid_image_name_test.rb

संबंधित मुद्दे