一、Dockefile简介
Dockerfile是一个包含用于组合映像的命令的文本文档,可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile
中的指令自动生成映像。
docker build
命令用于从Dockerfile构建映像,常用格式:docker build -t tag image:tag dir, dir标识dockerfile的工作目录。例如 “docker build -t jakeli1992/lnmp ./”。可以在docker build
命令中使用-f
标志指向文件系统中任何位置的Dockerfile。
先创建一个专门做dockerfile的工作目录,dockerfile文件名首字母必须大写,需要打包到镜像的文件需放置在此工作目录内部,在工作目录中如果有不需要打包到镜像的文件,可以创建.dockerignore隐藏文件注明不需要打包的文件,支持使用通配符。
二、Dockerfile指令
编写dockerfile第一行可以注释符“#”开头注明docker的简介描述。
1.FROM
From指令是最重要的一个且必须位Dockerfile文件开篇的第一个非注释行,用于为镜像文件构建过程指定基准镜像,后续的指令运行于此基准所提供的运行环境。实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在docker主机上传查找指定的镜像文件,在其不存在时会从Docker Hub Registry上拉取所需镜像文件,如果找不到则报错。
Synatax:
FROM <repository>[:<tag>]或 FROM <repository>@<digest>
<repository>为image的名称,<tag>为image标签,省略则为latest.
2. MAINTAINER (depreacted)
用于让Dockerfile制作者提供本人的详细信息
Syntax
MAINTAINER <authr’s detail>: <authr’s detail>可是任意文本,但一般为作者名字和邮箱,如:MAINTAINER “jake <zqjsyl@163.com>”
3. LABEL ( LABEL instead of MAINTANIER)
为image添加元数据
Syntax:
LABEL <key>=<value> <key>=<value> <key>=<value> … ,例如:LABEL MAINTAINER “jake <zqjsyl@163.com>”
4. COPY
用于从Docker宿主机复制文件到创建的新镜像文件
Syntax:
COPY <src> … <dest> 或 COPY [“<src>” … “<dest>”]
<src>: 要复制的源文件或目录,支持使用通配符;
<dest>: 目标路径,即正在创建image的文件路径;建议<dest>使用绝对路径,否则COPY指令则以WORKDIR为其起始路径,如果路径中有空白字符,通常使用第二种格式。
文件复制准则:
- <src>必须是build上下文中的路径,不能是其父目录的文件,
- 如果<src>是目录,则其内部文件或子目录会被递归复制,但<src>目录自身不会被复制
- 如果指定了多个<src>, 或在<src>中使用了通配符,则<dest>必须是一个目录,且必须以/结尾
- 如果<dest>事先不存在,它将会被自动创建,这包括其父目录路径
- 如果文件名称中有空白字符,可以使用COPY [“<src>” … “<dest>”]这种方式。
5. ADD
ADD指令类似于COPY指令,ADD支持使用TAR文件和URL路径
Syntax
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>;
6.WORKDIR
用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定工作目录
Syntax: WORKDIR <dirpath>
- 在dockerfile文件中,WORKDIR指令可以出现多次,其路径也可为相对路径,不过是相对于前一个WORKDIR指令指定的路径
- 另外WORKDIR也可以调用由ENV指定定义的变量,如:
WORKDIR /var/log WORKDIR $STATEPATH
7.VOLUME
用于在image中创建一个挂载点目录,以挂载Docker host上的卷或其他容器上的卷。
Syntax:
VOLUME <mountpoint>或 VOLUME ["<mountpoint>"]
- 如果挂载点目录路径下此文件存在,docker run命令会在卷挂载完成后将此前的所有文件复制到新挂载的卷中。
- 通常在dockerfile中无需指定宿主机上挂载目录,由docker自动管理卷。
8.EXPORE
用于为容器打开指定要监听的端口以实现与外部通讯
Syntax
- EXPORE <port>[/<protocol>][<port>[/<protocol>]…]
<protocol>用于指定传输层协议,可为tcp或udp二者之一,默认为TCP协议
- EXPORT指令可一次指定多个端口,例如:
EXPORE 1211/udp 11211/tcp
- 默认docker run的时候这些指定的端口不会直接暴露出去,如果需要暴露可以docker run命令中添加-P选项(暴露所有端口)。
9.ENV
用于为镜像定义所需要的环境变量,并可被dockerfile文件中位于其后的其他指令所调用(如ENV、ADD、COPY等指令),调用格式为$variable_name或${variable_name}
Syntax
ENV <key><value>或
ENV <key>=<value> …
- 第一种格式,<key>后的所有内容均会被视作其<value>的组成部分,因此,一次只能设置一个变量
- 第二种格式可一次设置多个变量,每个变量为一个”<key>=<value>”的键值对,如果<value>中包含空格,可以用反斜线(\)进行转义,也可以通过对<value>加引号进行标识;另外,反斜杠也可用于续行。
- 定义多个变量时,建议使用第二种方式,以便在同一层中完成所有功能。
NOTE:
- 在docker run启动容器的时候,可以指定变量ENV,如:
docker run --name web1 --rm -P -e WEB_DIR1="/opt/package" image:tag
- docker run的时候也可以打印出所有变量信息,如:
docker run -name web1 --rm -P image:tag printenv
10.RUN
用于指定docker build过程中运行的程序,其可以是任意基础镜像支持的命令
Syntax:
RUN <COMMAND>或
RUN [“<executable>”,”<param1>”,”param2″]
第一种格式,<command>通常是一个shell命令,且以”/bin/sh -c”来运行它,这意味着此进程在容器中PID不为1,不能接收Unix信号,因此此进程接收不到SIGTERM信号;
第二种格式参数是一个json格式的数组,其中<executable>为要运行的命令,后面的<paramN>为传递给命令的选项参数;然而,此种格式指定的命令不会以”/bin/sh -c”来发起,因此常见的shell操作如变量替换以及通配符(?.*等)替换符将不会进行;不过,如果运行的命令依赖于此shell特性的话,可以将其替换为类似如下格式:
RUN ["/bin/bash","-c","<executable>","<param1>"]
提示:json数组中的引号,要使用双引号。
11.CMD
类似于RUN指令,CMD指令也可用于运行任何命令或应用程序,不过,二者运行的时间点不同
- RUN指令运行于镜像文件构建中,而CMD指令运行于Dockerfile构建出的新镜像文件启动一个容器时;
- CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止;不过,CMD指定的命令可以被docker run的命令选项所覆盖
- 在dockerfile中可以存在多个CMD命令,但仅最后一个会生效。
Syntax
CMD <COMMAND>或 CMD ["executable","param1","param2"]或 CMD ["<param1>","<param2>"]
- 前两种语法意义同RUN;
- 第三种则用于为ENTRYPOINT指令提供默认参数;
12.ENTRYPOINT
- 类似于CMD指令的功能,用于为容器制定默认的运行程序,从而使得容器时一个单独的可执行程序
- 与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被作为参数传递给ENTRYPOINT指定的程序。不过,docker run命令的–ENTRYPOINT选项的参数可覆盖ENTRYPOINT指令的程序。
Syntax
ENTRYPOINT <command>
ENTRYPOINT [“executable”,”param1″,”param2″]
- docker run命令传入的命令参数会覆盖CMD指令的内容并附加到ENTRYPOINT命令最后作为其参数使用
- Dockerfile文件中也可以存在多个ENTRYPOINT命令,但仅有最后一个生效
未完待续:
评论前必须登录!
注册