DockerFile

DockerFile 是一个文本文件,包含一条条指令,每一条指令构建一层,因此每条指令的内容,就是描述该层是如何构建的。

DockerFile 指令

FROM:指定基础镜像,定制镜像,一般是以一个镜像为基础,在其基础上进行定制。这个指令就是指定基础镜像的。

RUN:这个指令是用来执行命令,也是制作镜像的时候,最常用的指令之一。有两种格式:

RUN <命令>

exec 格式: RUN ["可执行文件", "参数1", "参数2"]

RUN 一条命令就会 commit 保存一层储存,因此,如果有多个命令,一般是使用&&进行连接,防止镜像臃肿。

COPY:这个指令是在构建上下目录中的文件或者目录复制到新一层的镜像中的路径中。这个指令也有两种格式:

COPY <源路径>... <目标路径>

COPY ["<源路径1>",... "<目标路径>"] ,源路径可以是多个,也支持通配符匹配。

ADD:这个指令的格式和性质基本一致,但是在 COPY 基础上增加了一些功能。比如源路径可以是 URL 地址,docker 会自动下载这个文件,复制到目标路径;如果是一个压缩文件,docker 会自动解压到目标路径,支持压缩格式为 gzip , bzip2 以及 xz,如果不需要解压,就需要使用 COPY 命令。

CMD:这个指令是用于启动容器的命令,容器就是进程,如果没有指定启动的时候运行什么命令,就会直接退出了,当然也可以在 docker run 的时候直接指定运行命令。命令格式跟 RUN 很相似:

shell 格式: CMD <命令>

exec 格式: CMD ["可执行文件", "参数1", "参数2"...]

参数列表格式: CMD [“参数 1”, “参数 2”…] 。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。

在容器里面,没有后台运行的概念,如果所有进程都正常退出以后,容器就退出了。

ENTRYPOINT :这个指令的格式和 RUN 指令格式一样,分为 exec 格式和 shell 格式。ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。 ENTRYPOINT 在运行时也可以替代,不过比 CMD 要略显繁琐,需要通过 docker run 的参数 –entrypoint 来指定。

ENV:设置环境变量,有两种格式

ENV <key> <value>

ENV <key1>=<value1> <key2>=<value2>...

设置环境变量后,后面的指令就可以使用$直接获取到变量值。

ARG:构建参数。

格式: ARG <参数名>[=<默认值>]

构建参数和 ENV 的效果一样,都是设置环境变量。所不同的是, ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。但是不要因此就是用 ARG 保存密码之类的信息,因为 docker history 还是可以看到所有值的。

VOLUME:定义匿名卷,格式为:

VOLUME ["<路径1>", "<路径2>"...]

VOLUME <路径>

指定之后,容器启动之后,会自动挂载宿主机的目录到容器里面。如果没有指定,可以使用-v 参数进行挂载。

EXPOSE:声明端口,格式为

EXPOSE <端口1> [<端口2>...] 。

EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。

dcoker run 的是可以使用-p 参数来手动映射端口。

WORKDIR:指定工作目录,格式为

WORKDIR <工作目录路径>

使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,该目录需要已经存在, WORKDIR 并不会帮你建立目录。在 RUN 命令的时候,cd 之后的目录,对于下一层的 RUN 不是不生效的,对于一些写相对路径的命令就会出现失败。

USER:指定当前用户,格式:

USER <用户名>

USER 指令和 WORKDIR 相似,都是改变环境状态并影响以后的层。 WORKDIR 是改变工作目录, USER 则是改变之后层的执行 RUN , CMD 以及 ENTRYPOINT 这类命令的身份。当然,和 WORKDIR 一样, USER 只是帮助你切换到指定用户而已,这个用户必须是事先建立好的,否则无法切换。

HEALTHCHECK:健康检查,格式:

HEALTHCHECK [选项] CMD <命令> :设置检查容器健康状况的命令

HEALTHCHECK NONE :如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令,HEALTHCHECK 指令是告诉 Docker 应该如何进行判断容器的状态是否正常,这是 Docker 1.12 引入的新指令。在没有 HEALTHCHECK 指令前,Docker 引擎只可以通过容器内主进程是否退出来判断容器是否状态异常。