2015-05-01 10 views
8

Sto costruendo un'immagine di finestra mobile sul mio Raspberry Pi, che ovviamente richiede del tempo. Il problema qui è che anche i comandi molto semplici nel Dockerfile come l'impostazione di una variabile d'ambiente, usando chmod +x su un singolo file o esponendo la porta 80, impiegano minuti per completarsi.è molto lenta anche con i comandi semplici

Ecco un estratto della mia 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 

Tenete a mente questo sta usando un'immagine ARMv6 di base, in modo che possa funzionare su un Raspberry Pi e sto usando finestra mobile 1.5.0 costruito per la hypriot Raspberry Pi OS.

Copia i livelli creati per ogni comando o perché ciascuno degli ultimi comandi richiede minuti per essere completato?

+0

Non andare a aiutare molto, ma si potrebbe unire tutti i tuoi istruzioni esegue in una sola riga, quale sarebbe un po 'più efficiente. –

+0

Ho pensato a questo e sicuramente migliorerebbe le prestazioni generali. Tuttavia, non risolvo il problema con ENV, EXPOSE, WORKDIR, ecc., Che è ugualmente cattivo. – felixbr

+0

Nella directory sono presenti file non necessari? Come '.git' perché è un repository git. Aggiungi questo e qualsiasi altra cosa a '.dockerignore' e potresti notare un aumento della velocità. –

risposta

6

Ogni istruzione di Dockerfile verrà eseguita in un contenitore. Significa che per ogni istruzione farà il seguente:

  • un'istanza di un contenitore dall'immagine creata dal passaggio precedente, che creerà un nuovo livello (R/W uno)
  • Fare la cosa (PiP installazione, ecc ..)
  • Commit, che copierà lo strato superiore come livello di immagine (io sono abbastanza sicuro che sta copiando lo strato)
  • E rimuovere il contenitore (se è specificata l'opzione --rm) (in tal modo, rimuovendo il livello di lettura/scrittura del contenitore)

Ci sono alcune operazioni di I/O coinvolte. Su un SSD è molto veloce, oltre che su un buon disco fisso. Quando lo costruisci su Raspberry PI, se lo costruisci sulla scheda SD (o MicroSD), le prestazioni della scheda SD probabilmente non sono così buone. Dipenderà dalla classe di te MicroSD e anche allora, non penso che sia davvero buono per la scheda. Ho provato con un semplice progetto di nodo e ci sono voluti alcuni minuti invece di pochi secondi come sul mio portatile. È collegato all'hardware (principalmente I/O per la scheda SD, forse un po 'la CPU, ma ...).

Si potrebbe voler provare a utilizzare un disco rigido esterno collegato a Raspberry Pi e spostare le cartelle della finestra mobile lì, per vedere se le prestazioni sono migliori.

+1

Ciò conferma il mio sospetto. Un hard disk esterno sarebbe d'aiuto se è possibile specificare dove la finestra mobile memorizza i contenitori e le immagini. L'impostazione predefinita è '/ var/lib/docker /'. Ho spostato comandi costanti come ENV, EXPOSE e VOLUME prima di COPY, quindi almeno sono memorizzati nella cache la maggior parte del tempo, il che rende accettabile. – felixbr

+1

Sì. Il modo in cui l'ho fatto su una delle mie macchine è stato disabilitare temporaneamente la finestra mobile (e assicurarsi che nulla acceda alla cartella ''/var/lib/docker''), spostando questa cartella su un'unità esterna (o nel mio caso altra partizione) e fare un mount bind o un mount (specificato in ''/etc/fstab''. –

2

Questa è una vecchia domanda ma, per riferimento, è possibile che tu abbia sofferto del driver di archiviazione scelto.

Su Ubuntu/Debian, Docker utilizza per impostazione predefinita un driver di archiviazione AUFS, che è abbastanza veloce. Su altre distribuzioni, Docker utilizza per impostazione predefinita un driver di archiviazione di devicemapper, che è molto lento con la configurazione predefinita (a causa di una modalità "loop-lvm", configurata di default e non consigliata per l'uso di produzione).

controllare questa guida di riferimento e per vedere come configurare il driver di archiviazione devicemapper della produzione (senza loop): https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/

Problemi correlati