Ok, quindi ho trovato questo fantastico articolo sull'efficienza durante la scrittura di un file Docker.
Questo è un esempio di un file docker non valido che aggiunge il codice dell'applicazione prima di eseguire l' RUN npm install
istruzione:
FROM ubuntu
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get -y install python-software-properties git build-essential
RUN add-apt-repository -y ppa:chris-lea/node.js
RUN apt-get update
RUN apt-get -y install nodejs
WORKDIR /opt/app
COPY . /opt/app
RUN npm install
EXPOSE 3001
CMD ["node", "server.js"]
Dividendo la copia dell'applicazione in 2 istruzioni COPY (una per il file package.json e l'altra per il resto dei file) ed eseguendo l'istruzione di installazione npm prima di aggiungere il codice effettivo, qualsiasi modifica del codice non attiverà l'installazione di RUN npm istruzione, solo le modifiche del package.json lo attiveranno. File docker migliore pratica:
FROM ubuntu
MAINTAINER David Weinstein <david@bitjudo.com>
# install our dependencies and nodejs
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get -y install python-software-properties git build-essential
RUN add-apt-repository -y ppa:chris-lea/node.js
RUN apt-get update
RUN apt-get -y install nodejs
# use changes to package.json to force Docker not to use the cache
# when we change our application's nodejs dependencies:
COPY package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/
# From here we load our application's code in, therefore the previous docker
# "layer" thats been cached will be used if possible
WORKDIR /opt/app
COPY . /opt/app
EXPOSE 3000
CMD ["node", "server.js"]
Qui è dove è stato aggiunto il file package.json, installa le sue dipendenze e copiale nel contenitore WORKDIR, dove risiede l'app:
ADD package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/
Per evitare la fase di installazione di npm su ogni build docker, copia queste righe e modifica ^ / opt / app ^ nella posizione in cui si trova la tua app all'interno del contenitore.
ADD
è scoraggiato a favore diCOPY
, afaik.COPY
è ancora più efficace. IMO, gli ultimi due paragrafi non sono necessari, poiché sono duplicati e anche dal punto di vista dell'app non importa dove sul file system risiede l'app, purchéWORKDIR
sia impostata.