好吧,我在編寫docker文件時發現了效率爲this great article。
這是一個壞的搬運工文件運行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 install指令,任何代碼更改都不會觸發RUN npm install指令,只有package.json的更改纔會觸發它。更好的做法搬運工文件:
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"]
這就是的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構建階段只複製這些行並將^/opt/app ^更改爲應用程序在容器中的位置。
工程。但有些觀點。 'ADD'不鼓勵'COPY',afaik。 「COPY」更加有效。國際海事組織,最後兩段沒有必要,因爲它們是重複的,而且從應用程序的角度來看,只要設置了「WORKDIR」,那麼應用程序所在的文件系統上的位置就不重要了。 – eljefedelrodeodeljefe
更好的是將所有的apt-get命令合併到一個RUN中,包括一個'apt-get clean'。另外,將./node_modules添加到.dockerignore中,以避免將工作目錄複製到構建的容器中,並加快構建的構建上下文複製步驟。 – Symmetric
爲什麼在單獨的RUN中執行復制命令?如果我移動node_modules包而不是複製它,這有什麼關係嗎?因爲它可能會相對較大,具體取決於您安裝的數量。 –