Ok, więc znalazłem ten świetny artykuł o wydajności podczas pisania pliku dockera.
Oto przykład złego pliku dockera, który dodaje kod aplikacji przed uruchomieniem RUN npm install
instrukcji:
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"]
Dzieląc kopię aplikacji na 2 instrukcje COPY (jedną dla pliku package.json, a drugą dla pozostałych plików) i uruchamiając instrukcję instalacji npm przed dodaniem właściwego kodu, żadna zmiana kodu nie wywoła instalacji RUN npm instrukcji, tylko zmiany w pliku package.json będą ją wywoływać. Lepsze praktyki w pliku dockera:
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"]
W tym miejscu dodano plik package.json, zainstaluj jego zależności i skopiuj je do kontenera WORKDIR, w którym znajduje się aplikacja:
ADD package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/
Aby uniknąć fazy instalacji npm w każdej kompilacji platformy Docker, po prostu skopiuj te wiersze i zmień ^ / opt / app ^ na lokalizację, w której znajduje się Twoja aplikacja w kontenerze.
ADD
jest odradzany na korzyśćCOPY
, afaik.COPY
jest jeszcze bardziej skuteczny. IMO, ostatnie dwa akapity nie są konieczne, ponieważ są duplikatami, a także z punktu widzenia aplikacji nie ma znaczenia, gdzie w systemie plików znajduje się aplikacja, o ileWORKDIR
jest ustawiona.