比较两个Dockerfile,功能完全一样,但是写法不同,结果会一样吗?
FROM centos:7
RUN rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm \
&& yum install nginx -y \
&& yum install net-tools -y \
&& yum install vim -y \
&& yum install keepalived -y \
&& touch /etc/keepalived/check_nginx.sh \
&& echo "A=\`ps -ef | grep nginx | grep -v grep | wc -l\` \n\
if [ $A -eq 0 ];then \n\
nginx \n\
sleep 2 \n\
if [ \`ps -ef | grep nginx | grep -v grep | wc -l\` -eq 0 ];then \n\
#killall keepalived \n\
ps -ef|grep keepalived|grep -v grep|awk '{print $2}'|xargs kill -9 \n\
fi \n\
fi " > /etc/keepalived/check_nginx.sh \
&& chmod +x /etc/keepalived/check_nginx.sh
CMD [/bash/bin]
另一种写法:
FROM centos:7
RUN rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm \
RUN yum install nginx -y
RUN yum install net-tools -y
RUN yum install vim -y
RUN yum install keepalived -y
RUN touch /etc/keepalived/check_nginx.sh
RUN echo "A=\`ps -ef | grep nginx | grep -v grep | wc -l\` \n\
if [ $A -eq 0 ];then \n\
nginx \n\
sleep 2 \n\
if [ \`ps -ef | grep nginx | grep -v grep | wc -l\` -eq 0 ];then \n\
#killall keepalived \n\
ps -ef|grep keepalived|grep -v grep|awk '{print $2}'|xargs kill -9 \n\
fi \n\
fi " > /etc/keepalived/check_nginx.sh
RUN chmod +x /etc/keepalived/check_nginx.sh
CMD [/bash/bin]
两个 Dockerfile 用 docker build ,结果如下:
REPOSITORY TAG IMAGE ID CREATED SIZE
entry latest e100eda23d9f 6 seconds ago 462MB
<none> <none> 8747c80d63bf 7 minutes ago 1.03GB
注意 SIZE ,差距非常大,为什么呢?
Docker镜像分层机制
Docker镜像是由一系列层来构成的,每层代表Dockerfile中的一条指令,例如:
FROM centos:7
COPY . /app
RUN yum install nginx
CMD /bin/bash
该Dockerfile包含四个命令,每个命令都会新创建一个层。
FROM语句会从centos:7镜像创建一个层。
COPY指令会从当前目录下添加一些文件。
RUN指令构建第三层
CMD是在容器中运行命令行
总结
构建镜像时,各层依次堆叠,可以想见,堆叠的层越多,镜像的体积就会越大。尽可能合并堆叠层数,对控制镜像的体积有非常大的好处。
如上所示的例子,两个Dockerfile都时安装 nginx 和 keepalived ,只是Dockerfile的写法不一样,体积相差巨大。