2014-08-30 4 views
7

도커 iself없이 도커 이미지를 만들고 싶습니다. Packer을 보았지만 Docker를 빌더 호스트에 설치해야합니다.도커 이미지 형식

나는 Docker Registry API documentation을 보았지만이 정보는 거기에없는 것으로 보입니다.

이미지가 단순히 tarball 인 것 같지만 형식의 완전한 사양, 즉 exect 형식이 필요하며 필요한 메타 데이터 파일이 무엇인지보고 싶습니다. 레지스트리에서 이미지를 다운로드하고 내부 내용을 볼 수는 있지만 이미지 자체를 가져 오는 방법에 대한 정보는 없습니다.

내 프로젝트의 아이디어는 제가 컴파일 한 atefacts에서 이미지를 생성하고 레지스트리에 업로드하는 스크립트를 구현하는 것입니다. 이 목적을 위해 OpenEmbedded을 사용하고 싶습니다. 기본적으로 이것은 Bitbake에 대한 확장 일 것입니다.

답변

4

James Coyle's blog을 읽은 후에 나는 docker savedocker 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 파일에 파일이 없습니다.

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

이이 파일 시스템에 대한 간단한 증분 변경 사항이 포함되어 있는지 :

그래서 4.0K 빈 타르볼의 표준 크기가 있다고 가정.

결론적으로 패커와 마찬가지로 Docker를 사용하여 이미지를 만들고 레지스트리에 밀어 넣는 것이 가장 좋습니다.

처음부터 이미지를 만드는 방법은 described in the docs입니다.

docker import - scratch은 타르볼에 무엇이 있는지 신경 쓰지 않습니다. 나는 그것이 단순히 rootfs라고 가정한다. OpenEmbedded 통합의 측면에서

> 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 

, 그것은 경우 yocto 박스에서 제공하는 무언가이다 rootfs 타르볼을 구축하고, rootfs를 가져 official Python library를 사용 import_image(src='rootfs.tar', repository='scratch')로 타볼 다음 개인 레지스트리 방법을 밀어 아마 최선의 방법 .

이것은 가장 우아한 해결책은 아니지만 지금은 어떻게 작동해야하는지에 대한 것입니다. 그렇지 않으면 아마도 자신의 방식으로 rootfs 리비전을 관리하고 배포 할 수 있으며 대상 호스트에서 docker import을 사용합니다. 그래도 여전히 적합하지는 않지만 다소 간단합니다.

4

도커 이미지 형식은 여기에 지정된 : https://github.com/docker/docker/blob/master/image/spec/v1.md

가장 간단한 이미지가 포함 된 tar 파일 않습니다 :

repositories 
uniqid/VERSION 
uniqid/json 
uniqid/layer.tar 
버전이 1.0 포함

는 layer.tar이는 chroot 내용과 JSON을 포함/저장소는 위의 스펙에 지정된대로 JSON 파일입니다.

결과 타르는 docker load < image.tar

을 통해 도커에로드 할 수 있습니다.
관련 문제