Tôi muốn trích xuất một tập tin từ hình ảnh Docker mà không phải chạy hình ảnh.
Các docker save
tùy chọn không phải là currrently một lựa chọn khả thi đối với tôi là nó tiết kiệm quá lớn của một tập tin chỉ để un-tar một tập tin cụ thể.
Tôi muốn trích xuất một tập tin từ hình ảnh Docker mà không phải chạy hình ảnh.
Các docker save
tùy chọn không phải là currrently một lựa chọn khả thi đối với tôi là nó tiết kiệm quá lớn của một tập tin chỉ để un-tar một tập tin cụ thể.
Câu trả lời:
Bạn có thể trích xuất các tập tin từ một hình ảnh bằng các lệnh sau:
docker create $image # returns container ID
docker cp $container_id:$source_path $destination_path
docker rm $container_id
Theo docker create
tài liệu , điều này không chạy container:
Các
docker create
lệnh tạo ra một lớp chứa có thể ghi lên ảnh cụ thể và chuẩn bị nó cho chạy lệnh chỉ định. ID container sau đó được in raSTDOUT
. Điều này tương tự nhưdocker run -d
ngoại trừ container không bao giờ được bắt đầu. Sau đó, bạn có thể sử dụngdocker start <container_id>
lệnh để khởi động container tại bất kỳ điểm nào.
Để tham khảo (câu trả lời trước của tôi), một cách ít hiệu quả hơn để trích xuất một tệp từ một hình ảnh là như sau:
docker run some_image cat $file_path > $output_path
docker run --entrypoint /bin/sh my_image -c /bin/cat some_file
Không ai ở trên làm việc cho tôi. Lệnh làm việc hoàn chỉnh là:
docker run --rm --entrypoint /bin/sh image_name -c "cat /path/filename" > output_filename
Không có dấu ngoặc kép cat
được thông qua mà không có tên tệp, vì vậy nó không biết phải hiển thị gì. Ngoài ra, nên xóa container sau khi lệnh kết thúc.
Nếu tôi không nhầm, tôi tin rằng các container docker lưu trữ các tệp được lưu trong bộ nhớ cache được tạo trong thư mục sau cho Ubuntu:
/var/lib/docker/aufs/diff/<container_id>
Từ đó bạn sẽ có thể truy cập hệ thống tệp và truy xuất (các) tệp của mình.
layersize
và json
, và cũng không thể đọc được người dùng (ngay cả khi người dùng nằm trong nhóm docker). /var/lib/docker/aufs/diff
sẽ chứa tệp mà tôi tìm kiếm (nhưng được phân loại không theo id container) và cũng không thể đọc được.
/var/lib/docker/aufs
(nhưng không phải tất cả các thư mục khác trong /var/lib/docker/
)
Nếu lưu trữ toàn bộ đầu ra docker save
không phải là một tùy chọn, bạn có thể sử dụng các đường ống để chỉ trích xuất tệp cần thiết từ nó.
Thật không may, vì đầu ra là một "tar of tars", nó có thể là một quá trình lặp đi lặp lại một chút.
Những gì tôi đã làm khi tôi cần giải nén một tập tin là:
1) Xác định phiên bản hình ảnh mà tập tin bạn quan tâm đã thay đổi gần đây nhất (cách bạn thực hiện việc này có thể phụ thuộc vào hình ảnh của bạn) và ngày nó được tạo / lưu
2) Lấy toàn bộ mục lục từ đầu ra của docker save
lệnh với:
docker save IMAGE_NAME | tar -tvf -
3) Phạt layer.tar
(các) tệp trong đầu ra của lệnh đó khớp với ngày của hình ảnh mà bạn đã xác định trong bước 1. (bạn có thể thêm | grep layer.tar
vào để chỉ hiển thị các tệp đó)
4) Trích xuất layer.tar
tập tin đó ra tiêu chuẩn và lấy mục lục của nó:
docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -tvf -
5) Xác minh tệp bạn muốn được liệt kê và giải nén nó khi bạn tìm thấy tên:
docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - PATH/TO/YOUR/FILE
Nếu có nhiều hơn một layer.tar
tệp khớp với ngày bạn đang tìm kiếm ở bước 2/3, bạn có thể cần lặp lại bước 4 cho mỗi tệp cho đến khi bạn tìm đúng.
Thay thế văn bản bằng chữ in hoa trong các lệnh trên bằng tên hình ảnh, tổng kiểm tra và tên tệp chính xác cho trường hợp của bạn.