Docker之Dockerfile(二)

来源:互联网 发布:给mac aird理件升级 编辑:程序博客网 时间:2024/06/10 11:53

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 <image>[:tag]FROM <image>@<digest>    <image>:指定基准镜像文件或及标签    <tag>:基准镜像的标签,可选,缺省默认为latestExp:FROM docker.io/centos:latest #以顶层仓库的centos:latest为基准镜像MAINTANIER    提供制作此镜像的作者信息,不限位置,推荐在FROM指令之后语法:MAINTANIER <author’s detail>#可是任意文本,推荐作者名及邮件地址Exp:MAINTANIER wangye 120649294@qq.comCOPY    用于从docker主机复制文件到新镜像文件内语法:COPY <src>...<dest>COPY [“<src>”...”<dest>”]    <src>:docker主机上的源文件或目录,支持通配符    <dest>:新镜像的路径,建议使用绝对路径,否则以WORKDIR为其起始路径文件复制准则:<src>必须是build上下文中的路径,不能是其父目录中文件如果<src>是目录,会被递归复制,但<src>目录自身不会被复制如指定多个<src>,或使用通配符,则<dest>必须是一个目录,且必须以/结尾如果指定的<dest>不存在,会自动创建,也包含其父目录路径Exp:COPY /data/python.sh /scripts/ #将docker主机的/data/python.sh脚本复制到新镜像的/scripts/目录下ADD    类似COPY指令,ADD支持使用TAR文件和URL路径语法:ADD <src>...<dest>ADD [“<src>”,...”[dest]”操作准则:同COPY指令如果<src>为URL且不以/结尾,则<src>指定的文件将被下载并直接被创建为<dest>,如果<dest>以/结尾,则文件名URL指定的文件将被直接下载并保存为<dest>/<filename>如果<src>是一个本地系统上的压缩格式的tar文件,它将被展开一个目录,其效果类似“tar -x”命令,然而,通过URL获取到的tar文件将被不会自动展开。如果<src>有多个,或其间接或直接使用了通配符,则<dest>必须是一个以/结尾的目录路径,如果<dest>不以/结尾,则其被视作一个普通文件,<src>的内容将被直接写入<dest>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 <dirpath>Exp:WORKDIR /smartwy/file/ #后续命令为相对路径时,以此做为工作目录VOLUME    在新image中创建一个挂载点目录,以挂载docker主机上的卷或其它容器的卷,一般用于存放数据库和需要保持的数据等。语法:VOLUME <mountpoint>VOLUME [“<mountpoint>”]如果挂载点目录下存有文件,docker run 命令会在卷挂载完成后将此前的所有文件复制到新挂载的卷中。EXPOSE    用于为容器打开指定要监听的端口以实现与外部通讯,在启动容器时需要通过-P,Docker主机会自动分配一个端口映射到image指定的端口,使用-p,则是可以指定本地端口映射到image指定的端口语法:EXPOSE <pointnumber>Exp:EXPOSE 22 23 80 ENV    用于为镜像定义所需要的环境变量,并可被Dockerfile文件中位于其后的其它指令调用。语法:ENV <key> <value>ENV <key>=<value>调用格式:$variable_name或${variable_name}第一种格式,<key>之后的所有内容均会被视作其<value>的组成部分,因此一次只能设置一个变量第二种格式可用一次设置多个变量,每个变量为一个“<key>=<value>”的键值对,如果<value>中包含空格,可以使用\反斜线进行转义,也可通过对<value>加引号进行标识,另外,反斜线也可用于续行Exp:ENV BASE_DIR /data/file/ADD /root/file $BASE_DIRRUN    用于指定Docker build过程中运行的程序,其可以是任何命令语法:RUN <command>RUN [“<executable>”,”<param1>”,”<param2>”]第一种格式,<command>通常是一个shell命令,且以“/bin/sh –c”来运行它,这意味着此进程在容器中的PID不为1,不能接收unix信号,因此,当使用docker stop <container>命令停止容器时,此进程接受不到SIGTERM信号。第二种格式中的参数是一个JSON格式的属组,其中<executable>为要运行的命令,后面的<paramN>为传递给命令的选项或参数,然而,此种格式指定的命令不会以“/bin/sh –c ”来发起,因此常见的shell操作如变量替换以及通配符(?,*等)替换将不会被进行,如果需要依赖shell此特性,可以将其替换为类似下面格式RUN [“/bin/bash”,”-c”,”<executable>”,”<param1>”]Exp:RUN yum –y install nginx php-fpmCMD    类似RUN指令,CMD也可用于运行任何命令或应用程序,但二者的运行时间点不同,RUN指令运行与映像文件构建过程中,而CMD指令运行与基于Dockerfile构建出的新映像文件启动一个容器时。CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止,不过,CMD指令可以被docker run 的命令行选项所覆盖,在dockerfile中可以存在多个CMD指令,但仅最后一个会生效。语法:CMD <command>CMD [“<executable>”,”<param1>”,”<param2>”]CMD [“<param1>”,”<param2>”]前两种语法格式同RUN第三种则用于ENTRYPOINT指令提供默认参数Exp:CMD [“nginx”]ENTRYPOINT    类似CMD指令。用于容器指定默认程序,从而使得容器像一个单独的可执行程序,与CMD不同的是,有ENTRYPOINT启动的程序不会被Dokcer run命令行指定的参数覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序。不过,docker run命令的—entrypoint选项的参数可覆盖ENTRYPOINT指令的程序语法:ENTRYPOINT <command>ENTRYPOINT [“<executable>”,”<param1>”,”<param2>”]USER    用于指定运行image时或运行dockerfile中任何RUN,CMD或ENTRYPOINT指令指定的程序时的用户名或UID语法:USER <UID>|<USERNAME>注意:UID可以为有效任意数字,但其必须为/etc/passwd中有效UID,否则,docker run 将运行失败。ONBUILD    用于在Dockerfile中定义一个触发器。Dockerfile用于build映像文件,此映像文件亦可作为BASE image被另一个Dockerfile用作FROM指令参数,并以此构建出新的映像文件,在后面的这个dockerfile文件中的FROM指令在build过程中被执行时,将会“触发”创建其BASE image的dockerfile文件中的ONBUILD指令定义的触发器。语法:ONBUILD <INSTRUCTION>尽管任何指令或可被注册称为触发器指令,但ONBUILD不能自我嵌套,且不会触发FROM和MAINTAINER指令。在ONBUILD指令使用ADD或COPY指令时,应注意源文件一定要存在,否则会构建失败。如使用ONBUILD指令,建议在标签中注明。Exp:ONBUILD RUN /usr/sbin/echo “from smartwy” >> /etc/issueDockerfile文件编写完成后,在其工作目录下执行: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/

原创粉丝点击