2016-11-13 21 views
5

Hãy lấy hình ảnh cá voi làm ví dụ. docker history hiển thị như sau:docker: trích xuất một lớp từ một hình ảnh

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 

Tôi muốn trích xuất lớp có tiêu đề ADD file:bla. Có một công cụ/cách để làm điều này?

+0

Bạn có ý nghĩa gì khi 'trích xuất'? –

+0

Theo https://github.com/docker/docker/blob/master/image/spec/v1.md, một lớp là một tệp JSON và thay đổi thực sự đối với hệ thống tệp. Vì vậy, lý tưởng khai thác sẽ cung cấp cho tôi cả hai – lang2

Trả lời

2

tôi không thực sự hiểu những gì bạn có nghĩa là bằng cách "chiết xuất" nhưng nếu bạn muốn nhận được thêm thông tin về hình ảnh, chạy

docker inspect <image_name> 

Bạn bạn muốn nhận được tập tin, sau đó chạy container từ hình ảnh này. Hãy thử

docker export <container_name> > abc.tar 

sau đó, chiết xuấtabc.tar và tìm tệp của bạn.

+1

Đó là về cơ bản những gì tôi muốn nhưng tôi muốn có thể chỉ định một lớp và không phải là toàn bộ điều. – lang2

4

Có vẻ như những người khác cũng muốn có tính năng này, nhưng rất tiếc là hiện tại nó dường như không tồn tại.

Xem thêm this issue và ở đây một related request mà bị từ chối.

Nếu bạn đang sử dụng tốt với lưu Docker đầy đủ (docker save) và sau đó giải nén một tarball với lớp của bạn, thì đây có thể:

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 

Bây giờ foobar.tar sẽ chứa các trạng thái hệ thống tập tin từ thời điểm khác nhau. Kiểm tra tarball này cho thấy, trong trường hợp của tôi, một tập tin repositories với

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

mà chỉ, mà lớp mới nhất là fdf43.... Bạn có thể có được một tarball với những nội dung hệ thống tập tin của lớp này qua

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

Có một công cụ, undocker, mà tự động quá trình này, nhưng tôi không chắc chắn liệu nó sẽ làm việc với các định dạng hiện tại của tệp tar đã lưu.

1

Trong trường hợp cụ thể này, có vẻ như lệnh ADD đã thêm hình ảnh cơ sở vào hệ thống tệp. Nếu bạn chạy docker history --no-trunc docker/whalesay, đầy đủ các lệnh là:

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

docker history báo cáo rằng lớp đặc biệt là 188MB. Hãy xem xét các lớp này chi tiết hơn:

$ 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 
... 

Có vẻ như một ứng viên khá tốt! Bây giờ bạn có thể giải nén lớp đó và kéo các tệp ra khỏi nó.

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

Nếu bạn đang tìm kiếm để kéo một tập tin cụ thể ra khỏi một lớp, nhưng bạn không biết lớp, bạn có thể làm điều này.Trước tiên, trích xuất tất cả các lớp:

$ tar xf whalesay.tar 

Bây giờ bạn đã có tất cả các lớp dưới dạng tệp .tar riêng lẻ. Hãy tìm một tập tin:

$ 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 

Cuối cùng, trích xuất các tập tin từ các lớp bạn muốn:

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

này sẽ trích xuất tập tin đó với đường dẫn đầy đủ tương đối so với thư mục hiện hành.

$ cat usr/local/share/cows/docker.cow 
## 
## Docker Cow 
## 
$the_cow = <<EOC; 
    $thoughts 
    $thoughts 
     $thoughts  
        ##  .    
       ## ## ##  ==    
      ## ## ## ##  ===    
     /""""""""""""""""\___/ ===   
    ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~/===- ~~~ 
     \\______ o   __/    
     \\ \\  __/    
      \\____\\______/ 
EOC 
Các vấn đề liên quan