Ok, encontré este gran artículo sobre la eficiencia al escribir un archivo de ventana acoplable.
Este es un ejemplo de un archivo docker incorrecto que agrega el código de la aplicación antes de ejecutar la RUN npm install
instrucción:
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"]
Al dividir la copia de la aplicación en 2 instrucciones COPY (una para el archivo package.json y la otra para el resto de los archivos) y ejecutar la instrucción de instalación npm antes de agregar el código real, cualquier cambio de código no activará la instalación de RUN npm instrucción, solo los cambios del package.json lo activarán. Archivo acoplable de mejores prácticas:
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"]
Aquí es donde se agregó el archivo package.json, instale sus dependencias y cópielas en el contenedor WORKDIR, donde reside la aplicación:
ADD package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/
Para evitar la fase de instalación de npm en cada compilación de la ventana acoplable, simplemente copie esas líneas y cambie ^ / opt / app ^ a la ubicación de su aplicación dentro del contenedor.
ADD
se desanima a favor deCOPY
, afaik.COPY
es aún más eficaz. En mi opinión, los dos últimos párrafos no son necesarios, ya que son duplicados y también desde el punto de vista de la aplicación, no importa en qué parte del sistema de archivos viva la aplicación, siempre queWORKDIR
esté configurado.