Docker之Dockerfile(二)

Docker之Dockerfile(二)

    Dockfile是一种被Docker程序解释的文本格式的配置文件,Dockerfile由一条一条的指令组成,
    每条指令对应Linux下面的一条命令。docker程序将这些Dockerfile指令翻译真正的linux命令。
    Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile。
    Docker程序将读取Dockerfile,根据指令生成定制的image。相比image这种黑盒子,
    Dockerfile这种显而易见的脚本更容易被使用者接受,它明确的表明image是怎么产生的。
    有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦。
    Dockerfile可分为四部分:基础镜像,维护者,镜像操作指令,容器启动时执行指令。

FROM
    FROM指令是最重要的,且必须为第一个非注释行,用于为构建映像文件的基准镜像,后续指令基于此基准镜像执行。
基准镜像可以是任何可用的镜像文件,默认在docker build时会在docker主机上查找知道镜像文件,
其不在时则会从docker hub registry上查找下载使用。
语法:
FROM [:tag]
FROM @
    :指定基准镜像文件或及标签
    :基准镜像的标签,可选,缺省默认为latest
Exp:
FROM docker.io/centos:latest #以顶层仓库的centos:latest为基准镜像

MAINTANIER
    提供制作此镜像的作者信息,不限位置,推荐在FROM指令之后
语法:
MAINTANIER #可是任意文本,推荐作者名及邮件地址
Exp:
MAINTANIER wangye [email protected]

COPY
    用于从docker主机复制文件到新镜像文件内
语法:
COPY ...
COPY [“”...””]
    :docker主机上的源文件或目录,支持通配符
    :新镜像的路径,建议使用绝对路径,否则以WORKDIR为其起始路径
文件复制准则:
必须是build上下文中的路径,不能是其父目录中文件
如果是目录,会被递归复制,但目录自身不会被复制
如指定多个,或使用通配符,则必须是一个目录,且必须以/结尾
如果指定的不存在,会自动创建,也包含其父目录路径
Exp:
COPY /data/python.sh /scripts/ #将docker主机的/data/python.sh脚本复制到新镜像的/scripts/目录下

ADD
    类似COPY指令,ADD支持使用TAR文件和URL路径
语法:
ADD ...
ADD [“”,...”[dest]”
操作准则:
同COPY指令
如果为URL且不以/结尾,则指定的文件将被下载并直接被创建为,如果以/结尾,则文件名URL指定的文件将被直接下载并保存为/
如果是一个本地系统上的压缩格式的tar文件,它将被展开一个目录,其效果类似“tar -x”命令,然而,通过URL获取到的tar文件将被不会自动展开。
如果有多个,或其间接或直接使用了通配符,则必须是一个以/结尾的目录路径,如果不以/结尾,则其被视作一个普通文件,的内容将被直接写入
Exp:
ADD /data/test*  /file/ #将/data目录下所有以test开头的文件复制到新镜像系统的/file目录下,
ADD /data/filename.tar.xz /file/ #将/data/filename.tar.xz文件解压到新镜像的/file目录下

WORKDIR
    用于为Dockerfile中所有的RUN,CMD,ENTRYPOINT,COPY,ADD指定设定工作目录,可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径做为工作目录。
语法:
WORKDIR 
Exp:
WORKDIR /smartwy/file/ #后续命令为相对路径时,以此做为工作目录

VOLUME
    在新image中创建一个挂载点目录,以挂载docker主机上的卷或其它容器的卷,一般用于存放数据库和需要保持的数据等。
语法:
VOLUME 
VOLUME [“”]
如果挂载点目录下存有文件,docker run 命令会在卷挂载完成后将此前的所有文件复制到新挂载的卷中。

EXPOSE
    用于为容器打开指定要监听的端口以实现与外部通讯,在启动容器时需要通过-P,Docker主机会自动分配一个端口映射到image指定的端口,使用-p,则是可以指定本地端口映射到image指定的端口
语法:
EXPOSE 
Exp:
EXPOSE 22 23 80 

ENV
    用于为镜像定义所需要的环境变量,并可被Dockerfile文件中位于其后的其它指令调用。
语法:
ENV  
ENV =
调用格式:$variable_name或${variable_name}
第一种格式,之后的所有内容均会被视作其的组成部分,因此一次只能设置一个变量
第二种格式可用一次设置多个变量,每个变量为一个“=”的键值对,如果中包含空格,可以使用\反斜线进行转义,也可通过对加引号进行标识,另外,反斜线也可用于续行
Exp:
ENV BASE_DIR /data/file/
ADD /root/file $BASE_DIR

RUN
    用于指定Docker build过程中运行的程序,其可以是任何命令
语法:
RUN 
RUN [“”,””,””]
第一种格式,通常是一个shell命令,且以“/bin/sh –c”来运行它,这意味着此进程在容器中的PID不为1,不能接收unix信号,因此,当使用docker stop 命令停止容器时,此进程接受不到SIGTERM信号。
第二种格式中的参数是一个JSON格式的属组,其中为要运行的命令,后面的为传递给命令的选项或参数,然而,此种格式指定的命令不会以“/bin/sh –c ”来发起,因此常见的shell操作如变量替换以及通配符(?,*等)替换将不会被进行,如果需要依赖shell此特性,可以将其替换为类似下面格式
RUN [“/bin/bash”,”-c”,””,””]
Exp:
RUN yum –y install nginx php-fpm

CMD
    类似RUN指令,CMD也可用于运行任何命令或应用程序,但二者的运行时间点不同,RUN指令运行与映像文件构建过程中,而CMD指令运行与基于Dockerfile构建出的新映像文件启动一个容器时。
CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止,不过,CMD指令可以被docker run 的命令行选项所覆盖,在dockerfile中可以存在多个CMD指令,但仅最后一个会生效。
语法:
CMD 
CMD [“”,””,””]
CMD [“”,””]
前两种语法格式同RUN
第三种则用于ENTRYPOINT指令提供默认参数
Exp:
CMD [“nginx”]

ENTRYPOINT
    类似CMD指令。用于容器指定默认程序,从而使得容器像一个单独的可执行程序,与CMD不同的是,有ENTRYPOINT启动的程序不会被Dokcer run命令行指定的参数覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序。
不过,docker run命令的—entrypoint选项的参数可覆盖ENTRYPOINT指令的程序
语法:
ENTRYPOINT 
ENTRYPOINT [“”,””,””]

USER
    用于指定运行image时或运行dockerfile中任何RUN,CMD或ENTRYPOINT指令指定的程序时的用户名或UID
语法:
USER |
注意:UID可以为有效任意数字,但其必须为/etc/passwd中有效UID,否则,docker run 将运行失败。

ONBUILD
    用于在Dockerfile中定义一个触发器。Dockerfile用于build映像文件,此映像文件亦可作为BASE image被另一个Dockerfile用作FROM指令参数,并以此构建出新的映像文件,在后面的这个dockerfile文件中的FROM指令在build过程中被执行时,将会“触发”创建其BASE image的dockerfile文件中的ONBUILD指令定义的触发器。
语法:
ONBUILD 
尽管任何指令或可被注册称为触发器指令,但ONBUILD不能自我嵌套,且不会触发FROM和MAINTAINER指令。
在ONBUILD指令使用ADD或COPY指令时,应注意源文件一定要存在,否则会构建失败。
如使用ONBUILD指令,建议在标签中注明。
Exp:
ONBUILD RUN /usr/sbin/echo “from smartwy” >> /etc/issue

Dockerfile文件编写完成后,在其工作目录下执行:
docker build –t smartwy/centos/testbuild:v0.1 ./ #基于当前目录下的dockerfile文件创建名为smartwy/centos/testbuild的镜像,
如想上传到自己的映像仓库上须事先登录:
    Docker login
上传映像:
    Docker push smartwy/centos/testbuild:v0.1
下载映像:
    Docker pull smartwy/centos/testbuild:v0.1

各种示例请参考官方文档:
http://dockerfile.github.io/

你可能感兴趣的:(linux系统运维)