Dockerfile是Docker打包镜像时使用的说明文件,类似于构建rpm包的spec文件。里面由一些指令和配置构成。本文将一些Dockerfile的编写。其实我们可以把它看成就是spec的一个扩展版。
总的语法也和spec很像,以这样的语句来表示。支持#注释。
举个栗子:
这是个很简单的Dockerfile。
6 |
RUN yum install -y memcached
|
8 |
ENTRYPOINT [ "memcached" ]
|
里面定义了一些基础信息,安装的命令,以及最后启动的命令。下面将根据这些分类来讲解每个命令的用途。
基础信息:
这是镜像的基础信息。
基础镜像指定,FROM:
Docker的构建需要指定一个父镜像,这通过FROM指定。这表明镜像将以指定的父镜像为基础构建。
作者信息,MAINTAINER:
写代码要留名。
镜像制作命令:
在制作镜像时,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:
这是将外部文件复制到镜像中的指令。
运行命令:
这是容器启动时的相关命令。
容器启动命令一,ENTRYPOINT:
指定容器启动时执行的命令,字面意思是进入点。
2 |
ENTRYPOINT ["executable", "param1", "param2"] (like an exec, the preferred form) |
3 |
NTRYPOINT command param1 param2 (as a shell) |
注意:可以多次设置,但是只有最后一个有效。
如果使用第一种语法,在run的时候,传入的参数会接在后面。
2 |
ENTRYPOINT [ "/bin/cat" , "Hello" ]
|
1 |
docker run fedora 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的表示时,它就会作为参数。
2 |
CMD [ "param1" , "param2" ] (as default parameters to ENTRYPOINT)
|
特别注意:CMD会被run命令最后带的参数给覆盖掉。
所以,可以让ENTRYPOINT指定程序,然后CMD中放入默认参数。
运行的用户,USER:
可以指定运行的用户,默认root。
环境变量设置,ENV:
现在不少使用Docker的运维系统都是使用环境变量来传递一些集群相关的参数。我们也可以将某些默认配置放到这里。
结束:
以上就是Dockerfile的简单语法。应该足以用作普通的部署。我觉得如果Dockerfile弄得很复杂,那用Docker的那种方便从哪里来呢。
转载请注明:旅途@KryptosX » Dockerfile的简单介绍