Dockerfile的简单介绍

Dockerfile是Docker打包镜像时使用的说明文件,类似于构建rpm包的spec文件。里面由一些指令和配置构成。本文将一些Dockerfile的编写。其实我们可以把它看成就是spec的一个扩展版。

总的语法也和spec很像,以这样的语句来表示。支持#注释

1 命令 参数

举个栗子:

这是个很简单的Dockerfile。

1 #指定父镜像
2 FROM fedora
3 #作者信息
4 MAINTAINER kryptosx
5 #安装命令
6 RUN yum install -y memcached
7 #启动命令
8 ENTRYPOINT ["memcached"]

里面定义了一些基础信息,安装的命令,以及最后启动的命令。下面将根据这些分类来讲解每个命令的用途。

基础信息:

这是镜像的基础信息。

基础镜像指定,FROM:

Docker的构建需要指定一个父镜像,这通过FROM指定。这表明镜像将以指定的父镜像为基础构建。

1 FROM ubuntu

作者信息,MAINTAINER:

写代码要留名。

1 MAINTAINER kryptosx

镜像制作命令:

在制作镜像时,Docker会先使用上面的父镜像建立一个容器。然后,在容器内,我们就需要做该做的事情了。将需要安装的程序放置到它应该在的地方。

安装命令,RUN:

这里不同于rpm,rpm的spec定义的是安装时执行的命令。也就是安装的这个命令是在软件部署(yum install xxx)时执行的。Docker则是在打包时把安装的各种文件放到相应路径(Docker内的路径)。

1 RUN <command> (the command is run in a shell - `/bin/sh -c`)  
2 RUN ["executable""param1""param2" ... ]  (exec form)

不同的语法略有差异。比如第一句,直接接命令行。Docker会添加/bin/sh -c到命令前执行,可能会出现某些bash解析问题。下面这个类似函数穿参的做法,用过exec这类函数的同学应该明白。

在例子中,就用了yum直接安装了memchache。这应该是最简单的移植方式。

加入文件,ADD:

这是将外部文件复制到镜像中的指令。

1 ADD <src> <dest> 
2 #<src> 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url;
3 #<dest> 是容器中的绝对路径

运行命令:

这是容器启动时的相关命令。

容器启动命令一,ENTRYPOINT:

指定容器启动时执行的命令,字面意思是进入点。

1 #这和RUN的语法一样。
2 ENTRYPOINT ["executable", "param1", "param2"] (like an exec, the preferred form)
3 NTRYPOINT command param1 param2 (as a shell)

注意:可以多次设置,但是只有最后一个有效。

如果使用第一种语法,在run的时候,传入的参数会接在后面。

1 #例子
2 ENTRYPOINT ["/bin/cat","Hello"]
1 docker run fedora World
2 #输出"Hello World"

容器启动命令二,CMD:

CMD用于容器启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。

注意:该指令只能在文件中存在一次,如果有多个,则只执行最后一条。

CMD的语法和RUN,ENTRYPOINT一样。但有时候意义不同。

大多数人会直接将其用作命令执行。这种情况下,如果ENTRYPOINT也存在,那么就看二者相互覆盖。

1 CMD command param1 param2 (as a shell)
1 CMD ["executable","param1","param2"] (like an exec, this is the preferred form)

上面的这个表示,在没有ENTRYPOINT时,也是作为命令执行,但当ENTRYPOINT存在,是exec的表示时,它就会作为参数。

1 #作为参数
2 CMD ["param1","param2"] (as default parameters to ENTRYPOINT)

特别注意:CMD会被run命令最后带的参数给覆盖掉。

所以,可以让ENTRYPOINT指定程序,然后CMD中放入默认参数。

运行的用户,USER:

可以指定运行的用户,默认root。

环境变量设置,ENV:

现在不少使用Docker的运维系统都是使用环境变量来传递一些集群相关的参数。我们也可以将某些默认配置放到这里。

1 ENV <key> <value>

结束:

以上就是Dockerfile的简单语法。应该足以用作普通的部署。我觉得如果Dockerfile弄得很复杂,那用Docker的那种方便从哪里来呢。

转载请注明:旅途@KryptosX » Dockerfile的简单介绍

上一篇:寻找出现频率超过一半的数


下一篇:Linux系统针对网卡中断的优化处理