分享交流
合作共赢!

Docker容器的基础使用方法总结【五】——Dockerfile

一、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命令,但仅有最后一个生效

未完待续:

Docker容器的基础使用方法总结【六】——Dockerfile

赞(1) 打赏
未经允许不得转载:琼杰笔记 » Docker容器的基础使用方法总结【五】——Dockerfile

评论 抢沙发

评论前必须登录!

 

分享交流,合作共赢!

联系我们加入QQ群

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏