2014-08-30 15 views
7

मैं डॉकर छवि के बिना एक डॉकर छवि बनाना चाहता हूं। मैंने Packer पर देखा है, लेकिन यह निर्माता के निर्माता पर डॉकर स्थापित करने की आवश्यकता है।डॉकर छवि प्रारूप

मैंने Docker Registry API documentation पर देखा है लेकिन यह जानकारी वहां दिखाई नहीं दे रही है।

मुझे लगता है कि छवि बस एक टैरबॉल है, लेकिन मैं प्रारूप का एक पूर्ण विनिर्देश देखना चाहता हूं, यानी प्रारूप का क्या आवश्यक है और कहीं भी मेटाडेटा फाइलों की आवश्यकता है। मैं रजिस्ट्री से एक छवि डाउनलोड करने का प्रयास कर सकता हूं और अंदर क्या देख सकता हूं, लेकिन छवि को स्वयं कैसे प्राप्त करें इस पर कोई जानकारी नहीं है।

मेरी परियोजना का विचार एक ऐसी स्क्रिप्ट को कार्यान्वित करना है जो मैंने संकलित किया है और इसे रजिस्ट्री में अपलोड करता है। मैं इस उद्देश्य के लिए OpenEmbedded का उपयोग करना चाहता हूं, अनिवार्य रूप से यह बिटबैक के लिए एक विस्तार होगा।

उत्तर

4

James Coyle's blog पढ़ने के बाद, मुझे लगा कि docker save और docker load आदेश मुझे चाहिए।

> docker images 
REPOSITORY   TAG     IMAGE ID   CREATED    VIRTUAL SIZE 
progrium/consul  latest    e9fe5db22401  11 days ago   25.81 MB 
> docker save e9fe5db22401 | tar x 
> ls e9fe5db22401* 
VERSION json layer.tar 

VERSION फ़ाइल केवल 1.0 शामिल है, और json काफी जानकारी का एक बहुत कुछ शामिल है:

{ 
    "id": "e9fe5db224015ddfa5ee9dbe43b414ecee1f3108fb6ed91add11d2f506beabff", 
    "parent": "68f9e4929a4152df9b79d0a44eeda042b5555fbd30a36f98ab425780c8d692eb", 
    "created": "2014-08-20T17:54:30.98176344Z", 
    "container": "3878e7e9b9935b7a1988cb3ebe9cd45150ea4b09768fc1af54e79b224bf35f26", 
    "container_config": { 
    "Hostname": "7f17ad58b5b8", 
    "Domainname": "", 
    "User": "", 
    "Memory": 0, 
    "MemorySwap": 0, 
    "CpuShares": 0, 
    "Cpuset": "", 
    "AttachStdin": false, 
    "AttachStdout": false, 
    "AttachStderr": false, 
    "PortSpecs": null, 
    "ExposedPorts": { 
     "53/udp": {}, 
     "8300/tcp": {}, 
     "8301/tcp": {}, 
     "8301/udp": {}, 
     "8302/tcp": {}, 
     "8302/udp": {}, 
     "8400/tcp": {}, 
     "8500/tcp": {} 
    }, 
    "Tty": false, 
    "OpenStdin": false, 
    "StdinOnce": false, 
    "Env": [ 
     "HOME=/", 
     "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", 
     "SHELL=/bin/bash" 
    ], 
    "Cmd": [ 
     "/bin/sh", 
     "-c", 
     "#(nop) CMD []" 
    ], 
    "Image": "68f9e4929a4152df9b79d0a44eeda042b5555fbd30a36f98ab425780c8d692eb", 
    "Volumes": { 
     "/data": {} 
    }, 
    "WorkingDir": "", 
    "Entrypoint": [ 
     "/bin/start" 
    ], 
    "NetworkDisabled": false, 
    "OnBuild": [ 
     "ADD ./config /config/" 
    ] 
    }, 
    "docker_version": "1.1.2", 
    "author": "Jeff Lindsay <[email protected]>", 
    "config": { 
    "Hostname": "7f17ad58b5b8", 
    "Domainname": "", 
    "User": "", 
    "Memory": 0, 
    "MemorySwap": 0, 
    "CpuShares": 0, 
    "Cpuset": "", 
    "AttachStdin": false, 
    "AttachStdout": false, 
    "AttachStderr": false, 
    "PortSpecs": null, 
    "ExposedPorts": { 
     "53/udp": {}, 
     "8300/tcp": {}, 
     "8301/tcp": {}, 
     "8301/udp": {}, 
     "8302/tcp": {}, 
     "8302/udp": {}, 
     "8400/tcp": {}, 
     "8500/tcp": {} 
    }, 
    "Tty": false, 
    "OpenStdin": false, 
    "StdinOnce": false, 
    "Env": [ 
     "HOME=/", 
     "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", 
     "SHELL=/bin/bash" 
    ], 
    "Cmd": [], 
    "Image": "68f9e4929a4152df9b79d0a44eeda042b5555fbd30a36f98ab425780c8d692eb", 
    "Volumes": { 
     "/data": {} 
    }, 
    "WorkingDir": "", 
    "Entrypoint": [ 
     "/bin/start" 
    ], 
    "NetworkDisabled": false, 
    "OnBuild": [ 
     "ADD ./config /config/" 
    ] 
    }, 
    "architecture": "amd64", 
    "os": "linux", 
    "Size": 0 
} 

layer.tar फ़ाइल रिक्त प्रतीत होता है। इसलिए माता-पिता और दादाजी का निरीक्षण किया गया, दोनों में layer.tar फ़ाइलों में कोई फ़ाइल नहीं थी।

तो यह सोचते हैं कि 4.0K एक खाली टारबॉल के लिए मानक आकार है:

for layer in $(du -hs */layer.tar | grep -v 4.0K | cut -f2) 
do (echo $layer:;tar tvf $layer) 
done 

देखने के लिए कि इन फाइल सिस्टम के लिए सरल वृद्धिशील परिवर्तन होते हैं।

तो एक निष्कर्ष यह है कि छवि बनाने के लिए डॉकर का उपयोग करना संभव है और इसे रजिस्ट्री को धक्का दें, जैसे पैकर करता है।

स्क्रैच से छवि बनाने का तरीका described in the docs है।

यह पता चला है कि docker import - scratch टैरबॉल में क्या है इसके बारे में परवाह नहीं करता है। मैं बस मानता हूं कि rootfs है।

> touch foo 
> tar c foo | docker import - scratch 
02bb6cd70aa2c9fbaba37c8031c7412272d804d50b2ec608e14db054fc0b9fab 
> docker save 02bb6cd70aa2c9fbaba37c8031c7412272d804d50b2ec608e14db054fc0b9fab | tar x 
> ls 02bb6cd70aa2c9fbaba37c8031c7412272d804d50b2ec608e14db054fc0b9fab/ 
VERSION json layer.tar 
> tar tvf 02bb6cd70aa2c9fbaba37c8031c7412272d804d50b2ec608e14db054fc0b9fab/layer.tar  
drwxr-xr-x 0/0    0 2014-09-01 13:46 ./ 
-rw-r--r-- 500/500   0 2014-09-01 13:46 foo 

OpenEmbedded एकीकरण के संदर्भ में, यह शायद सबसे अच्छा है rootfs टारबॉल, जो कुछ yocto बॉक्स से बाहर प्रदान करता है निर्माण करने के लिए, और official Python library का उपयोग rootfs आयात करने के लिए import_image(src='rootfs.tar', repository='scratch') साथ टारबॉल और फिर इसे धक्का निजी रजिस्ट्री विधि ।

यह सबसे सुरुचिपूर्ण समाधान नहीं है, लेकिन इस समय इसे इस तरह काम करना होगा। अन्यथा कोई शायद rootfs संशोधनों को अपने तरीके से प्रबंधित और तैनात कर सकता है, और लक्ष्य होस्ट पर docker import का उपयोग करें, जो अभी भी एक अच्छा फिट नहीं होगा, लेकिन कुछ हद तक सरल है।

4

डोकर छवि प्रारूप यहाँ निर्दिष्ट किया जाता है: https://github.com/docker/docker/blob/master/image/spec/v1.md

सरल संभव छवि एक टार फ़ाइल है जिसमें निम्नलिखित:

repositories 
uniqid/VERSION 
uniqid/json 
uniqid/layer.tar 

कहाँ संस्करण 1.0 होता है, layer.tar chroot सामग्री और json शामिल/रिपॉजिटरीज जेएसओएन फाइलें हैं जैसा उपर्युक्त स्पेक में निर्दिष्ट है।

परिणामी टैर docker load < image.tar

के माध्यम से डॉकर में लोड किया जा सकता है
संबंधित मुद्दे