Dockerfile 编写的正确姿势(一)

比较两个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的写法不一样,体积相差巨大。

# docker  

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×