ठीक है, इसलिए मुझे एक डॉक फ़ाइल लिखते समय दक्षता के बारे में यह शानदार लेख मिला ।
यह 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 COPY निर्देशों (पैकेज के लिए एक .json फ़ाइल और बाकी फाइलों के लिए अन्य) में विभाजित करके और वास्तविक कोड जोड़ने से पहले npm इंस्टॉल निर्देश चलाने के लिए, कोई भी कोड परिवर्तन नहीं होगा RUN npm स्थापित ट्रिगर निर्देश, केवल 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/
प्रत्येक docker पर npm स्थापित चरण से बचने के लिए, बस उन पंक्तियों की प्रतिलिपि बनाएँ और ^ / opt / app ^ को उस स्थान पर बदलें जहाँ आपका ऐप कंटेनर के अंदर रहता है।
ADD
के पक्ष में हतोत्साहित किया जाता हैCOPY
, afaik।COPY
और भी प्रभावी है। IMO, अंतिम दो पैराग्राफ आवश्यक नहीं हैं, क्योंकि वे डुप्लिकेट होते हैं और ऐप के दृष्टिकोण से भी यह कोई फर्क नहीं पड़ता कि फाइल सिस्टम पर वह ऐप कहां रहता है, जब तक किWORKDIR
सेट है।