文章目录
Dockerfile最佳实践
一个容器对应一个进程
一个Docker容器应该只对应一个进程,也就是一个Docker 镜像一般只包含一个应用的制品包(比如.jar)。
在需要组合多个进程的场景,使用容器组(比如Docker Compose,或Kubernetes Pod)。
选用合适的基础镜像
选用基础镜像的原则:
-
使用官方提供的基础镜像(official)
-
基础镜像应该提供足够的支持,使得Dockerfile尽量简单(easy enough)
-
基础镜像要足够精简,尽量不要包含不需要的内容(simple enough)
-
使用指定标签(版本)的基础镜像,不使用
latest
标签的基础镜像 (explicit)
把最少改动的步骤放在最前面
把最少改动的步骤放在最前面,也就是准备应用的COPY
步骤要放在安装工具和准备环境的RUN
命令之后,能够重用前面构建的层的cache,防止每次都要重复构建。Dockefile中步骤一般为:
- 选择基础镜像,比如:
FROM openjdk:8-jdk-stretch
- 安装Dockerfile后面步骤需要用到的工具和
docker exec
debug时需要用到的工具,比如:
RUN apt-get update && apt-get upgrade -y && apt-get install -y git curl && rm -rf /var/lib/apt/lists/*
- 其他的一些准备环境步骤,比如:
RUN curl -fsSL ${JENKINS_URL} -o /usr/share/jenkins/jenkins.war \
&& echo "${JENKINS_SHA} /usr/share/jenkins/jenkins.war" | sha256sum -c -
- 准备应用,比如:
COPY jenkins.sh /usr/local/bin/jenkins.sh
- 声明程序的入口点,比如:
ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/jenkins.sh"]
- 暴露端口,比如:
EXPOSE 8080
Dockerfile的步骤中只有
RUN
、COPY
和ADD
才会创建层,其它指令的先后顺序主要是根据Dockerfile的语