2016-11-13 1 views
5

고래 이미지를 예로 들어 봅시다. docker history는 다음을 보여줍니다docker : 이미지에서 레이어 추출

IMAGE    CREATED    CREATED BY          SIZE    COMMENT 
6b362a9f73eb  17 months ago  /bin/sh -C#(nop) ENV PATH=/usr/local/bin:/us 0 B 
<missing>   17 months ago  /bin/sh -c sh install.sh      30.37 kB 
<missing>   17 months ago  /bin/sh -c git reset --hard origin/master  43.27 kB 
<missing>   17 months ago  /bin/sh -C#(nop) WORKDIR /cowsay    0 B 
<missing>   17 months ago  /bin/sh -c git clone https://github.com/moxie 89.9 kB 
<missing>   17 months ago  /bin/sh -c apt-get -y update && apt-get insta 58.58 MB 
<missing>   18 months ago  /bin/sh -C#(nop) CMD ["/bin/bash"]    0 B 
<missing>   18 months ago  /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/ 1.895 kB 
<missing>   18 months ago  /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic 194.5 kB 
<missing>   18 months ago  /bin/sh -C#(nop) ADD file:f4d7b4b3402b5c53f2 188.1 MB 

내가 ADD file:bla을 말한다 레이어를 추출하고 싶습니다. 이 작업을 수행 할 수있는 도구가 있습니까?

+0

'추출'이란 무엇을 의미합니까? –

+0

https://github.com/docker/docker/blob/master/image/spec/v1.md에 따르면 레이어는 JSON 파일이며 실제 파일 시스템으로 변경됩니다. 그래서 이상적으로 추출은 나를 둘 다 줄 것입니다 – lang2

답변

2

당신이 이미지에 대한 자세한 정보를 얻으려면 정말 당신이 "추출"무슨 뜻인지 이해하지 않지만, 당신은 당신이 다음 파일을 얻을이 이미지에서 컨테이너를 실행하려면

docker inspect <image_name> 

를 실행합니다. 그 후

docker export <container_name> > abc.tar 

, 추출물abc.tar을 시도하고 파일을 찾을 수 있습니다.

+1

그건 기본적으로 내가 원하는 것입니다.하지만 모든 것을 지정하지 않고 레이어를 지정할 수 있기를 바랍니다. – lang2

4

다른 사람들도이 기능을 갖고 싶어하지만 불행히도 지금은 존재하지 않는 것 같습니다.

this issue 여기 거절당했습니다 related request 를 참조하십시오. 당신은 전체 고정 표시기 (docker save)를 저장하고 다음 층으로 타르를 추출 괜찮 경우

, 다음이 가능하다 :

docker run -it <your image> 
# do fancy stuff in the container 
docker commit <your container> foobar # create image from container 
docker history foobar # will show you the layers 
docker save -o foobar.tar foobar # dumps container contents to foobar.tar 

지금 foobar.tar 다른 시간에서 파일 시스템 상태를 포함합니다. 최신 층 fdf43... 것을 나타냅니다

{"foobar":{"latest":"fdf43d96e691c57e9afb4b85dba2e6745146a7ca9076c7284c6b2e1f93434562"}} 

으로, 내 경우에는, 파일 repositories을이 타르볼 쇼를 검사. 당신은 도구가

tar -x fdf43d96e691c57e9afb4b85dba2e6745146a7ca9076c7284c6b2e1f93434562/layer.tar -f foobar.tar 

를 통해 undocker,이 과정을 자동화 를이 계층의 파일 시스템의 내용과 타르를 얻을 수 있지만, 나는 그것이 현재의 형식 작동 여부를 모르겠어요 저장된 tar 파일

1

이 경우, ADD 명령이 기본 이미지를 파일 시스템에 추가 한 것처럼 보입니다. 당신이 docker history --no-trunc docker/whalesay을 실행하면 전체 명령은 다음과 같습니다

/bin/sh -C#(nop) ADD file:f4d7b4b3402b5c53f266bb7fdd7e728493d9a17f9ef20c8cb1b4759b6e66b70f in/

docker history

특정 층 188메가바이트 것을보고합니다. 이 레이어를 자세히 살펴 보겠습니다.

$ docker save docker/whalesay -o whalesay.tar 
$ tar tvf whalesay.tar 

... 
-rw-r--r-- 0/0  197181952 2015-05-25 22:04 cc88f763e297503d2407d6b462b2b390a6fd006b30f51c8efa03dd88fa801b89/layer.tar 
... 

꽤 좋은 후보자처럼 보입니다! 이제 해당 레이어를 추출하고 파일을 추출 할 수 있습니다.

$ tar xf whalesay.tar cc88f763e297503d2407d6b462b2b390a6fd006b30f51c8efa03dd88fa801b89/layer.tar 
$ tar xf cc88f763e297503d2407d6b462b2b390a6fd006b30f51c8efa03dd88fa801b89/layer.tar etc/passwd 

당신이 계층에서 특정 파일을 끌어 찾고,하지만 당신은 하는 계층을 모르는 경우, 당신은이 작업을 수행 할 수 있습니다.먼저 모든 레이어를 추출합니다.

$ tar xf whalesay.tar 

이제 모든 레이어를 개별 .tar 파일로 가져 왔습니다. 의 파일을 찾을 수 있습니다 :

$ for layer in */layer.tar; do tar -tf $layer | grep docker.cow && echo $layer; done 
usr/local/share/cows/docker.cow 
0523c5a0c4588dde33d61d171c41c2dc5c829db359f4d56ab896ab1c185ed936/layer.tar 
cowsay/cows/docker.cow 
40e8ae7bb4e5b9eaac56f5be7aa614ed50f163020c87ba59e905e01ef0af0a4f/layer.tar 
cowsay/cows/docker.cow 
f9bc8676543761ff3033813257937aeb77e9bc84296eaf025e27fe01643927cf/layer.tar 

마지막으로, 당신이 원하는 계층에서 파일을 추출 :

$ tar xf 0523c5a0c4588dde33d61d171c41c2dc5c829db359f4d56ab896ab1c185ed936/layer.tar \ 
     usr/local/share/cows/docker.cow 

이 현재 디렉토리의 전체 경로 상대적으로 해당 파일을 추출합니다.

$ cat usr/local/share/cows/docker.cow 
## 
## Docker Cow 
## 
$the_cow = <<EOC; 
    $thoughts 
    $thoughts 
     $thoughts  
        ##  .    
       ## ## ##  ==    
      ## ## ## ##  ===    
     /""""""""""""""""\___/ ===   
    ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~/===- ~~~ 
     \\______ o   __/    
     \\ \\  __/    
      \\____\\______/ 
EOC