Dockerfile最佳实践(一)

来源:互联网 发布:天津外国语大学 知乎 编辑:程序博客网 时间:2024/05/01 16:26

      Dockerfile最佳实践()

 

本次内容时通过说一些建议和技巧来帮助你使用Dockerfile.

 

1.使用缓存

 

Dockerfile的每条指令都会将结果提交为新的镜像,下一跳指令将会基于上一步指令的镜像的基础上构建,如果一个镜像存在相同的父镜像和指令(除了ADD),DOcker将会使用镜像而不是执行该指令,即缓存.

 

为了有效的利用缓存,你需要保持你的Dockerfile一致,并且尽量在末尾修改.Dockerfile的前五行其实可以固定写成如下这样:

FROM ubuntuMAINTAINER shanyongxu <783284481@qq.com>RUN echo ”deb http://archive.ubuntu.com/ubuntu precise main ubiverse” > etc/apt/sources.listRUN apt-get updateRUN apt-get upgrade -y


 

更改MAINTAINER指令会使Docker强制执行RUN指令来更新apt,而不是还是用缓存.

 

所以,我们应该使用常用且不变的Dockerfile开始指令来利用缓存.

 

2.使用标签

 

除非你正在用Docker做实验,否则你应当通过-t选项来docker build新的镜像以便用于标记构建的镜像.一个简单的可读标签将帮助你管理每个创建的镜像.

 

docker build -t=”syx/df_test” .


 

注意,始终通过-t标记来构建镜像.

 

3.公开端口

 

两个Docker的核心概念是可重复和可移植.镜像应该可以运行在任何主机上并且运行尽可能多的次数.Dockerfile中你有能力映射私有和共有端口,但是你永远不要通过Dockerfile映射公有端口.通过映射公有端口到主机上,你将只能运行一个容器化应用程序实例.

#private and public mappingEXPOSE 80:8080#private onlyEXPOSE 80


 

如果镜像的使用者关心容器公有映射了哪个公有端口,他们可以在运行镜像时通过-p参数设置,否则,docker会自动为容器分配端口.

切勿在Dockerfile映射公有端口.

 

4.CMDENTRYPOINT的语法.

 

CMDENTRYPOINT指令都非常简单,但他们都有一个隐藏的容易出错的功能,如果你不知道的话可能会在这里入坑,这些指令支持两种不同的语法:

CMD /bin/echo#orCMD [“/bin/echo”]


 

看起来没问题,但仔细一看其实两种方式的差距很大.如果你使用第二个语法:CMD(ENTRYPOINT)是一个数组,它执行的命令完全像你期望的那样.如果使用第一种语法,Docker会在你的命令之前加上/bin/sh -c.

 

如果你不知道Docker修改了CMD命令,在命令前加上/bin/sh -c可能会导致一些意想不到的问题以及难以理解的功能.因此,在使用这两个指令时你应当使用数组语法,因为数组语法会确切的执行你打算执行的命令.

 

使用CMDENTRYPOINT,请务必使用数组语法.

 

5.CMDENTRYPOINT结合使用更好

 

docker run命令中的参数都会传递给ENTRYPOINT指令,而不用担心它被覆盖(CMD不同).当与CMD一起使用时ENTRYPOINT的表现会更好.

 

0 0
原创粉丝点击