Docker可以通过Dockerfile的内容紫东构建镜像。
Dockerfile时一个包含创建镜像所有命令的文本文件,通过docker build
命令可以根据Dockerfile的内容构建镜像,在介绍构建之前,我们先了解一下Dockerfile的基本语法结构.
Dockerfile有以下指令选项:
- FROM
- MAINTAINER
- COPY
- ADD
- WORKDIR
- VOLUME
- EXPOSE
- ENV
- RUN
- CMD
- ENTRYPOINT
- USER
- ONBUILD
下面详细介绍各个指令的用法。
FROM
FROM指令时最重要的一个,并且必须为Dockerfile文件的第一个非注释行,其用于为镜像文件构建过程中指定一个基准镜像,后续的指令运行于次基准镜像所提供的运行环境。
语法
FROM <image>[:<tag>]
FROM <image>@<digest>
- image:指定作为base image的名称
- tag:base image的标签,为可选项,默认为latest
MAINTAINER
用于提供镜像作者的详细信息。
语法
MAINTAINER < author's detail >
COPY
用于将宿主机的文件复制镜像中
语法
COPY <src> ... <dest/> ] # 多文件复制需要以空格分隔,dest必须时目录且为dest/,
COPY ["<src>" ... "<dest>"] # 多文件复制需要以空格分隔,dest必须时目录且为dest/
支持通配符,路径中如果有空白,建议使用第二种格式,dest目录会在容器中自动创建。
ADD
类似于COPY指令,ADD支持tar文件和URL路径自动展开。
语法
ADD <src> ... <dest>
ADD ["<src>" ... "<dest>"]
- 如果<src>为URL且<dest>不以/结尾,则<src>指定的文件将被下载并直接被创建为<dest>
- 如果<dest>以/结尾,则文件名URL指定的文件将被直接下载并保存为<dest>/<filename>
- 如果<src>是一个本地系统上的压缩格式的tar文件,它将被展开为一个目录,其行为类似于“tar -x”命令;然而,通过URL获取到的tar文件将不会自动展开;
- 如果<src>有多个,或其间接或直接使用了通配符,则<dest>必须是一个以/结尾的目录路径;如果<dest>不以/结尾,则其被视作一个普通文件,<src>的内容将被直接写入到<dest>
WORKDIR
用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD设定工作目录。
语法
WORKDIR <dirpath>
WORKDIR $STATPATH
WORKDIR指令可出现多次,起路径可以为相对路径,不过其相对的时此前一个WORKDIR指令指定的路径。
WORKDIR也可以调用由ENV指定的变量。
VOLUME
用于在images中创建一个挂载点目录,以过载宿主机上的卷或其它容器上的卷。
语法
VOLUME <monuntpoint> //将容器中的mountpoint挂载到宿主机上
VOLUME ["<mountpoint"]
如果挂载点目录路径下此前有文件存在,docker run
命令会在卷挂载完成后将此前所有文件复制到新挂在卷中,基于此命令我们可以将容器中的日志挂载到宿主机上。
EXPOSE
用于为容器打开指定要监听的端口以实现与外部通信。
语法
EXPOSE <port>[/protocol] [<port>[/<protocol>] ... ]
- port:为端口
- protocol:为协议,默认为tcp协议,
EXPOSE指令可一次指定多个端口,例如:EXPOSE 11211/udp 11211/tcp
ENV
用于为镜像定义所需要的环境变量,并可悲Dockerfile文件中的其他指令(ENV、ADD、COPY)所调用。
调用格式为$var或者${var}
语法
ENV <key> <value> //一次只能设置一个变量
ENV <key>=<value> ... //一次能设置多个变量,如果value中有空格,使用`\`进行转义
定义多个变量时,建议使用第二种方式,以便于在同一层中完成所有的功能。
RUN
用于指定docker build过程中运行的程序,其可以是任何命令
语法
RUN <command>
RUN ["<executable>" , "<param1>", "<param2>", ...]
第一种:command
通常为shell命令,不能接收Unix信号
第二种:JSON格式的数组exectable
为要运行的命令,后面的parm
为命令的参数或选项。
CMD
用于运行任何命令或应用程序,RUN命令用于运行构建镜像的过程中,而CMD指令时运行基于Dockerfile构建出的新镜像文件启动容器时。
语法
CMD <command>
CMD ["<executable>","<parm1>","<parm2>"]
CMD ["<param1>","param2"]
前两种语法格式意义同RUN
第三种则用于ENTRYPOINT指令提供默认参数
ENTRYPOINT
用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序
与CMD命令不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数覆盖,而且,命令行参会会被当作参数传递给ENTRYPOINT指定的程序。
语法
ENTRYPOINT <command>
ENTRYPOINT ["executable","parm1","parm2"]
Dockerfile中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效
USER
指定运行images的用户名或UID,默认的运行用户为root
语法
USER <UID> | <User_Name>
UID可以为任意数字,但是实践中其必须为/etc/passwd中某用户的有效UID,否则docker run命令会运行失败。
ONBUILD
用于在Dockerfile中定义一个触发器
Dockerfile用于build镜像文件,此镜像文件可以作为base image
被另一个Dockerfile用作FROM指令的参数,并以之构建新的镜像文件。
ONBUILD <instruction>
尽管任何指令都可注册为触发器指令,但是ONBUILD不能自我嵌套,且不会出发FROM和MAINTAINER指令。
使用包含ONBUILD指令的Dockerfile构建的镜像应该使用特殊的标签,例如:ruby:2.0-onbuild
在ONBUILD指令中使用ADD或COPY指令应该格外小心,因为新构建过程的上下文在缺少指定的源文件时会失败
网友评论