2015-05-01 17 views
8

Tôi đang xây dựng một hình ảnh docker trên Raspberry Pi của tôi, tất nhiên mất một thời gian. Vấn đề ở đây là ngay cả các lệnh rất đơn giản trong Dockerfile như thiết lập một biến môi trường, sử dụng chmod +x trên một tập tin duy nhất hoặc phơi bày cổng 80 mất vài phút để hoàn thành.docker build rất chậm ngay cả với các lệnh đơn giản

Dưới đây là một đoạn trích của Dockerfile tôi:

FROM resin/rpi-raspbian 
MAINTAINER felixbr <[email protected]> 

RUN export DEBIAN_FRONTEND=noninteractive && apt-get update && apt-get install -y python python-dev python-pip python-numpy python-scipy python-mysqldb mysql-server redis-server nginx dos2unix poppler-utils 

COPY requirements.txt /app/ 

RUN pip install -r /app/requirements.txt 

COPY . /app 

WORKDIR /app 

RUN cp /app/nginx-django.cfg /etc/nginx/sites-enabled/default 
RUN chmod +x /app/start.sh 

ENV DOCKERIZED="true" 

CMD ./start.sh 

EXPOSE 80 

Hãy ghi nhớ này là sử dụng một hình ảnh ARMv6 cơ sở, vì vậy nó có thể chạy trên một Pi mâm xôi và tôi đang sử dụng Docker 1.5.0 xây dựng cho hypriot Raspberry Pi OS.

Có phải sao chép các lớp được xây dựng cho mọi lệnh hoặc tại sao mỗi lệnh cuối cùng mất vài phút để hoàn thành?

+0

Không sẽ giúp rất nhiều, nhưng bạn có thể kết hợp tất cả các lệnh RUN của bạn vào một dòng, sẽ hiệu quả hơn một chút. –

+0

Tôi nghĩ về điều này và nó chắc chắn sẽ cải thiện hiệu suất tổng thể. Tuy nhiên, tôi không giải quyết được vấn đề với ENV, EXPOSE, WORKDIR, v.v., cũng không kém phần quan trọng. – felixbr

+0

Bạn có các tệp không cần thiết trong thư mục không? Giống như '.git' vì nó là kho lưu trữ git. Thêm nó và bất kỳ thứ gì khác vào '.dockerignore' và bạn có thể nhận thấy tốc độ tăng lên. –

Trả lời

6

Mỗi lệnh của Dockerfile sẽ được chạy trong vùng chứa. Những gì nó có nghĩa là cho mỗi hướng dẫn nó sẽ làm như sau:

  • Khởi tạo một container từ các hình ảnh được tạo ra bởi các bước trước, mà sẽ tạo ra một layer mới (R/W một)
  • Làm điều (pip install, etc ..)
  • Cam kết sẽ sao chép lớp trên cùng thành một lớp hình ảnh (Tôi chắc là nó đang sao chép lớp)
  • Và loại bỏ vùng chứa (nếu tùy chọn --rm được chỉ định) (do đó, hãy xóa lớp Đọc/Ghi chứa)

Có một số hoạt động I/O liên quan. Trên một SSD nó thực sự nhanh chóng, cũng như trên một ổ cứng tốt. Khi bạn xây dựng nó trên Raspberry PI, nếu bạn xây dựng nó trên thẻ SD (hoặc MicroSD), hiệu suất của thẻ SD có lẽ không tốt. Nó sẽ phụ thuộc vào lớp của bạn MicroSD và thậm chí sau đó, tôi không nghĩ rằng nó thực sự tốt cho thẻ. Tôi đã thử với một dự án nút đơn giản, và nó chắc chắn mất một vài phút thay vì một vài giây như nó đã làm trên máy tính xách tay của tôi. Nó là phần cứng liên quan (chủ yếu là I/O cho thẻ SD, có thể một chút CPU, nhưng ...).

Bạn có thể muốn sử dụng ổ cứng ngoài được kết nối với Pi quả mâm xôi và di chuyển các thư mục đế cắm ở đó, để xem hiệu suất có tốt hơn không.

+1

Điều này xác nhận sự nghi ngờ của tôi. Một ổ đĩa cứng gắn ngoài sẽ giúp bạn nếu bạn có thể chỉ định nơi docker lưu trữ các thùng chứa và hình ảnh. Mặc định là '/ var/lib/docker /'. Tôi đã chuyển các lệnh liên tục như ENV, EXPOSE và VOLUME trước COPY, vì vậy ít nhất chúng được lưu trữ trong phần lớn thời gian, điều này làm cho nó có thể chấp nhận được. – felixbr

+1

Đúng. Cách mà tôi đã làm trên một máy tính của tôi là vô hiệu hóa docker temporarly (và chắc chắn không có gì đang truy cập thư mục ''/var/lib/docker''), di chuyển thư mục này đi trên ổ đĩa ngoài (hoặc trong trường hợp của tôi) phân vùng khác) và thực hiện gắn kết gắn kết hoặc gắn kết (được chỉ rõ trong ''/etc/fstab''. –

2

Đây là câu hỏi cũ nhưng để tham khảo, bạn có thể đã bị trình điều khiển lưu trữ đã chọn.

Trên Ubuntu/Debian, Docker sử dụng theo mặc định là trình điều khiển lưu trữ AUFS, khá nhanh. Trên các bản phân phối khác, Docker sử dụng mặc định trình điều khiển lưu trữ devicemapper, rất chậm với cấu hình mặc định (do chế độ "loop-lvm", được cấu hình theo mặc định và không recommandent để sử dụng sản xuất).

Kiểm tra hướng dẫn này để tham khảo và để xem làm thế nào để cấu hình trình điều khiển lưu trữ devicemapper trong sản xuất (không có chế độ vòng lặp): https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/

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