Tamam, bir docker dosyası yazarken verimlilikle ilgili bu harika makaleyi buldum .
Bu, RUN npm install
talimatı çalıştırmadan önce uygulama kodunu ekleyen hatalı bir docker dosyası örneğidir :
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"]
Uygulamanın kopyasını 2 COPY talimatına bölerek (biri package.json dosyası için diğeri diğer dosyalar için) ve gerçek kodu eklemeden önce npm kurulum talimatını çalıştırarak, herhangi bir kod değişikliği RUN npm kurulumunu tetiklemeyecektir. talimat, yalnızca package.json'daki değişiklikler onu tetikleyecektir. Daha iyi uygulama docker dosyası:
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 dosyasının eklendiği, bağımlılıklarını yüklediği ve bunları uygulamanın bulunduğu WORKDIR kapsayıcısına kopyaladığınız yer burasıdır:
ADD package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/
Her docker derlemesinde npm yükleme aşamasından kaçınmak için bu satırları kopyalayın ve ^ / opt / app ^ öğesini uygulamanızın kapsayıcı içinde bulunduğu konuma değiştirin.
ADD
lehine cesareti kırıldıCOPY
.COPY
daha da etkilidir. IMO, son iki paragraf gerekli değildir, çünkü bunlar yinelenir ve ayrıca uygulama açısındanWORKDIR
, ayarlandığı sürece uygulamanın dosya sisteminde nerede yaşadığı önemli değildir .