2015-05-01 19 views
8

Buduję obraz doka na moim Raspberry Pi, co oczywiście zajmuje trochę czasu. Problem polega na tym, że nawet bardzo proste polecenia w pliku Dockerfile, takie jak ustawienie zmiennej środowiskowej, użycie chmod +x na jednym pliku lub udostępnienie portu 80 zajmuje kilka minut.kompilacja dockera jest bardzo powolna, nawet przy prostych poleceniach

Oto fragment mojego Dockerfile:

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 

Pamiętaj, to jest przy użyciu ARMv6 bazowy obrazu, dzięki czemu można go uruchomić na Raspberry Pi i używam docker 1.5.0 zbudowany dla hypriot Raspberry Pi OS.

Czy to jest kopiowanie wbudowanych warstw dla każdego polecenia lub dlaczego wykonanie wszystkich ostatnich kilku poleceń zajmuje kilka minut?

+0

nie pomoże dużo, ale można połączyć wszystkie swoje instrukcje napotkasz jednej linii, który byłby nieco bardziej wydajny. –

+0

Myślałem o tym i na pewno poprawiłoby to ogólną wydajność. Nie rozwiązuję jednak problemu z ENV, EXPOSE, WORKDIR itp., Który jest równie zły. – felixbr

+0

Czy masz niepotrzebne pliki w katalogu? Jak '.git', ponieważ jest to repozytorium git. Dodaj to i wszystko do '.dockerignore' i możesz zauważyć przyspieszenie. –

Odpowiedz

6

Każda instrukcja Dockerfile zostanie uruchomiona w kontenerze. Co to znaczy, że dla każdej instrukcji będzie wykonać następujące czynności:

  • Utwórz wystąpienie pojemnik z obrazu utworzonego przez poprzedniego etapu, który będzie utworzyć nową warstwę (R/W jednym)
  • Wykonaj rzecz (pIP zainstalować, etc ..)
  • Commit, która skopiuje wierzchniej warstwy jako warstwy obrazu (jestem pewien, że jest kopiowanie warstwy)
  • i wyjmowanie pojemnika (jeśli opcja --rm podano) (w ten sposób usuwając warstwę odczytu/zapisu kontenera)

Występuje kilka operacji we/wy. Na dysku SSD jest naprawdę szybki, a także na dobrym dysku twardym. Kiedy budujesz go na Raspberry PI, jeśli zbudujesz go na karcie SD (lub MicroSD), wydajność karty SD prawdopodobnie nie jest dobra. Będzie to zależało od twojej klasy MicroSD, a nawet wtedy, nie sądzę, że jest to naprawdę dobre dla karty. Zrobiłem próbę za pomocą prostego projektu węzła i na pewno zajęło mi to kilka minut zamiast kilku sekund, jak na moim laptopie. Jest związany ze sprzętem (głównie I/O dla karty SD, może trochę procesora, ale ...).

Możesz spróbować użyć zewnętrznego dysku twardego podłączonego do raspberry Pi i przenieść tam foldery, aby sprawdzić, czy wydajność jest lepsza.

+1

Potwierdza to moje podejrzenia. Zewnętrzny dysk twardy może pomóc, jeśli możesz określić, gdzie doker przechowuje kontenery i obrazy. Wartością domyślną jest '/ var/lib/docker /'. Przenieśliłem stałe polecenia, takie jak ENV, EXPOSE i VOLUME przed COPY, więc przynajmniej są one buforowane przez większość czasu, co sprawia, że ​​jest to akceptowalne. – felixbr

+1

Tak. Sposób, w jaki zrobiłem to na jednej z moich maszyn, polegał na tymczasowym dezaktywowaniu okna dokowanego (i upewnij się, że nic nie jest dostępne w folderze ''/var/lib/docker''), przenosząc ten folder na dysk zewnętrzny (lub w moim przypadku inna partycja) i wykonaj montowanie bind lub mount (określone w ''/etc/fstab''. –

2

To jest stare pytanie, ale w celach informacyjnych mógł wystąpić problem z wybranym sterownikiem magazynu.

W systemie Ubuntu/Debian Docker domyślnie używa sterownika magazynu AUFS, który jest dość szybki. W innych dystrybucjach, Docker domyślnie używa sterownika pamięci masowej devicemapper, który jest bardzo wolny z domyślną konfiguracją (ze względu na tryb "loop-lvm", skonfigurowany domyślnie i nie zalecany do użytku produkcyjnego).

Sprawdź ten przewodnik dla odniesienia i zobaczyć, w jaki sposób skonfigurować sterownik pamięci devicemapper w produkcji (bez trybu pętla) https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/

Powiązane problemy