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 <image>[:tag]
FROM <image>@<digest>
    <image>:指定基准镜像文件或及标签
    <tag>:基准镜像的标签,可选,缺省默认为latest
Exp:
FROM docker.io/centos:latest #以顶层仓库的centos:latest为基准镜像

MAINTANIER
    提供制作此镜像的作者信息,不限位置,推荐在FROM指令之后
语法:
MAINTANIER <author’s detail>#可是任意文本,推荐作者名及邮件地址
Exp:
MAINTANIER wangye 120649294@qq.com

COPY
    用于从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_DIR

RUN
    用于指定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-fpm

CMD
    类似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/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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值