Ok, więc znalazłem this great article o skuteczności przy pisaniu pliku dokowanego.
Jest to przykład złego pliku Döcker dodanie kodu aplikacji przed uruchomieniem instrukcji 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"]
Dzieląc kopię wniosku na 2 instrukcji Copy (jeden dla pliku package.json i drugi dla pozostałych plików) i uruchomienie instrukcji instalacji npm przed dodaniem aktualnego kodu, zmiana kodu nie spowoduje uruchomienia instrukcji instalacji npm, tylko zmiany w pakiecie.json uruchomią ją. Lepsza plik praktyka doker:
FROM ubuntu
MAINTAINER David Weinstein <[email protected]>
# 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"]
To gdzie plik package.json dodał zainstalować jego zależności i skopiować je do WORKDIR pojemnika, gdzie aplikacja mieszka:
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ąć zainstalowania npm faza na każdej kompilacji dokowania po prostu skopiuj te linie i zmień ^/opt/app^na lokalizację, w której znajduje się aplikacja wewnątrz kontenera.
to działa. Niektóre punkty jednak. 'ADD' jest odradzane na rzecz' COPY', afaik. 'COPY' jest jeszcze bardziej efektywny.IMO, dwa ostatnie 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, pod warunkiem, że ustawione jest 'WORKDIR'. – eljefedelrodeodeljefe
Better-still to połączenie wszystkich komend apt-get w jeden RUN, w tym 'apt-get clean'. Dodaj także ./node_modules do pliku .dockerignore, aby uniknąć kopiowania katalogu roboczego do zbudowanego kontenera i przyspieszenia kroku kompilacji kontekstu kompilacji. – Symmetric
Z jakiego powodu wykonujesz polecenie kopiowania w oddzielnym URUCHOMIENIU? I ma to znaczenie, jeśli przeniesię pakiet node_modules zamiast go skopiować? Ponieważ może on być stosunkowo duży w zależności od tego, jak dużo zainstalujesz –