好的,我找到了这篇优秀的文章,介绍了编写Dockerfile时提高效率的方法。
下面是一个不好的Dockerfile示例,将应用代码添加到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"]
将应用程序的副本分成两个COPY指令(一个用于package.json文件,另一个用于其他文件),并在添加实际代码之前运行npm install指令,任何代码更改都不会触发RUN npm install指令,只有package.json的更改才会触发它。更好的Docker文件实践:
FROM ubuntu
MAINTAINER David Weinstein <david@bitjudo.com>
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
COPY package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/
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
命令。事实上,COPY
更加高效。在我看来,最后两段其实是重复的,并且从应用程序的角度来看,只要设置了WORKDIR
,应用程序存储在文件系统的任何位置都无所谓。 - eljefedelrodeodeljefeapt-get clean
命令。此外,将./node_modules添加到.dockerignore文件中,以避免将工作目录复制到构建容器中,从而加快构建过程中构建上下文复制步骤的速度。 - Symmetricpackage.json
添加到最终的目标位置即可(无需使用 cp/mv 命令)。这种方式同样有效。 - J. Fritz Barnes