Ok, então encontrei este ótimo artigo sobre eficiência ao escrever um arquivo docker.
Este é um exemplo de arquivo docker inválido adicionando o código do aplicativo antes de executar a RUN npm install
instrução:
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"]
Dividindo a cópia do aplicativo em 2 instruções COPY (uma para o arquivo package.json e outra para o restante dos arquivos) e executando a instrução de instalação do npm antes de adicionar o código real, qualquer alteração de código não acionará a instalação RUN do npm instrução, apenas alterações do package.json irão acioná-lo. Arquivo docker de prática recomendada:
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"]
É aqui que o arquivo package.json adicionado, instale suas dependências e copie-as para o contêiner WORKDIR, onde o aplicativo reside:
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 a fase de instalação do npm em cada build do docker, apenas copie essas linhas e altere ^ / opt / app ^ para o local em que seu aplicativo está dentro do contêiner.
ADD
é desencorajado em favor deCOPY
, afaik.COPY
é ainda mais eficaz. IMO, os dois últimos parágrafos não são necessários, uma vez que são duplicados e também do ponto de vista do app não importa onde no sistema de arquivos o app está, desde queWORKDIR
esteja configurado.