2014-08-30 19 views
6

Tôi có một tệp nén cục bộ ~ 300Mb mà tôi thêm vào hình ảnh trên đế. Trạng thái tiếp theo sau đó trích xuất hình ảnh.Docker làm thế nào để ADD một tập tin mà không có một cam kết nó vào một hình ảnh?

Vấn đề là câu lệnh ADD dẫn đến một cam kết dẫn đến một lớp hệ thống tệp mới làm cho hình ảnh ~ 300Mb lớn hơn mức cần thiết.

ADD /files/apache-stratos.zip /opt/apache-stratos.zip 
RUN unzip -q apache-stratos.zip && \ 
    rm apache-stratos.zip && \ 
    mv apache-stratos-* apache-stratos 

Câu hỏi: Có một công việc xung quanh để ADD tập tin địa phương mà không gây ra một cam kết?

Một lựa chọn là để chạy một máy chủ web đơn giản (ví dụ python -m SimpleHTTPServer) trước khi bắt đầu Docker xây dựng, và sau đó sử dụng wget để lấy các tập tin, nhưng điều đó có vẻ hơi lộn xộn:

RUN wget http://localhost:8000/apache-stratos.zip && \ 
    unzip -q apache-stratos.zip && \ 
    rm apache-stratos.zip && \ 
    mv apache-stratos-* apache-stratos 

lựa chọn khác là giải nén tập tin nén tại container bắt đầu thay vì thời gian xây dựng, nhưng tôi muốn giữ cho khởi động càng nhanh càng tốt.

Trả lời

13

Theo the documentation, nếu bạn chuyển tệp lưu trữ từ hệ thống tệp cục bộ (không phải URL) vào ADD trong Dockerfile (với đường dẫn đích, không phải đường dẫn + tên tệp), nó sẽ giải nén tệp vào thư mục đã cho .

Nếu < src> là một kho lưu trữ tar địa phương trong một định dạng nén công nhận (sắc, gzip, bzip2 hoặc xz) sau đó nó được giải nén như một thư mục. Tài nguyên từ các URL từ xa không được giải nén. Khi một thư mục được sao chép hoặc giải nén, nó có hành vi tương tự như tar -x: kết quả là sự kết hợp của:

1) Bất cứ điều gì tồn tại đường dẫn đích và 2) Nội dung của cây nguồn, với các xung đột được giải quyết có lợi cho "2." trên cơ sở từng tệp.

thử:

ADD /files/apache-stratos.zip /opt/ 

và xem các tập tin đang có, mà không cần giải nén thêm.

+8

Có vẻ như không giải nén tệp '.zip' trên Docker 1.2.0. –

+0

"Nếu [src] là tệp lưu trữ tar cục bộ theo định dạng nén được nhận dạng (danh tính, gzip, bzip2 hoặc xz) thì nó được giải nén dưới dạng thư mục". –

+0

Thực tế ADD thiếu hỗ trợ cho các tệp '.zip' có vẻ là một quyết định dự định: https://github.com/docker/docker/issues/15036 – jap1968

2

Bạn có thể sử dụng docker-squash để đè bẹp các lớp mới tạo. Điều đó sẽ làm giảm kích thước hình ảnh đáng kể.

Thật không may các giải pháp được đề cập (RUN curl ... && unzip ... & rm ..., giải nén khi bắt đầu vùng chứa) là các tùy chọn duy nhất tại thời điểm này (docker 1.11).

Các vấn đề liên quan