Гаразд, я знайшов цю чудову статтю про ефективність написання файлу докера.
Це приклад файлу поганого докера, який додає код програми перед запуском RUN npm install
інструкції:
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"]
Поділивши копію програми на 2 інструкції КОПІЮВАННЯ (одну для файлу package.json, а іншу для решти файлів) та запустивши інструкцію встановлення npm перед додаванням фактичного коду, будь-яка зміна коду не ініціює RUN npm install інструкція, лише зміни пакета package.json ініціюють його. Файл докера для кращої практики:
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"]
Тут додано файл package.json, встановлено його залежності та скопійовано в контейнер WORKDIR, де живе програма:
ADD package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/
Щоб уникнути етапу встановлення npm на кожній збірці докера, просто скопіюйте ці рядки та змініть ^ / opt / app ^ на місце, де живе ваша програма всередині контейнера.
ADD
знеохочується на користьCOPY
, afaik.COPY
ще ефективніше. IMO, останні два абзаци не є необхідними, оскільки вони є дублікатами, а також з точки зору програми не має значення, де у файловій системі живе програма, докиWORKDIR
встановлено.