Docker之Dockerfile(二)

xiaoxiao2021-02-28  165

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/

转载请注明原文地址: https://www.6miu.com/read-47474.html

最新回复(0)