โอเคฉันพบบทความดีๆเกี่ยวกับประสิทธิภาพเมื่อเขียนไฟล์นักเทียบท่า
นี่คือตัวอย่างของไฟล์นักเทียบท่าที่ไม่ดีที่เพิ่มรหัสแอปพลิเคชันก่อนรัน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 (คำสั่งหนึ่งสำหรับไฟล์ package.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/
หากต้องการหลีกเลี่ยงขั้นตอนการติดตั้ง npm ในนักเทียบท่าทุกรุ่นเพียงแค่คัดลอกบรรทัดเหล่านั้นแล้วเปลี่ยน ^ / opt / app ^ เป็นตำแหน่งที่แอปของคุณอาศัยอยู่ในคอนเทนเนอร์
ADD
ท้อแท้ในความโปรดปรานสำหรับCOPY
afaikCOPY
มีประสิทธิภาพมากยิ่งขึ้น IMO ไม่จำเป็นต้องใช้สองย่อหน้าสุดท้ายเนื่องจากซ้ำกันและจากมุมมองของแอปไม่สำคัญว่าแอปจะอยู่ที่ใดในระบบไฟล์ตราบเท่าที่WORKDIR
ตั้งค่าไว้