写在前面

因MarkDown编辑器语法原因,因内容较多,部分内容可能因未能及时转义导致出现内容错误,望指正!

通用规则

  • 指令不区分大小写。但是,惯例是让它们成为大写的,以便更容易将它们与参数区分开来。
  • 指令都是按顺序运行。
  • 一个Dockerfile 必须用FROM指令启动。该FROM指令指定您正在构建的基本映像(基本映像:没有父代的镜像)
  • 用’#'来注释说明

解析器指令

解析器指令不区分大小写,但是,惯例是它们是小写的

环境变量

  • 格式:$variable_name 或 ${variable_name}
  • 括号语法通常用于解决具有没有空格的变量名称的问题,例如${foo}_bar
  • ${variable:-word}表示if variable设置后,结果将是该值。如果variable未设置则word结果将是。
  • ${variable:+word}表示如果variable设置则word结果为结果,否则结果为空字符串。
    以下指令列表支持环境变量Dockerfile:ADD,COPY,ENV,EXPOSE,FROM,LABEL,STOPSIGNAL,USER,VOLUME,WORKDIR和ONBUILD

FROM

  • 格式:FROM <image> [AS <name>]
  • 或 FROM <image>[:<tag>] [AS <name>]
  • 或 FROM <image>[@<digest>] [AS <name>]
  • ARG是唯一一个可能优先于FROM的指令
  • 在单个Dockerfile可以出现多次
  • tag和digest如果你忽略他们,默认为最新的标签,如果不能找到标签值将返回一个错误。

RUN

  • 格式:RUN <command>
  • RUN [“executable”, “param1”, “param2”],注意要使用双引号
  • 在形式上可以使用(反斜杠)继续一个指令运行到下一行

CMD

格式:CMD [“executable”,“param1”,“param2”] #exec形式,这是首选形式

  • CMD [“param1”,“param2”] #为默认参数入口点
  • CMD command param1 param2 #shell格式
  • 只能有一个CMD Dockerfile指令,如果你列出多个CMD只有最后的CMD生效。
  • 一个CMD的主要目的是提供一个执行容器的默认值。
  • CMD形式不调用shell命令
  • RUN实际运行一个命令并提交结果,CMD在构建时不执行任何,但是指定镜像的默认选项

LABEL

  • 格式:LABEL <key>=<value> <key>=<value> <key>=<value> …
  • 一个镜像可以有多个标签。但最终都会被合并,新的值将覆盖旧的值

EXPOSE

  • 格式:EXPOSE <port> [<port>…]
  • 将容器指定的端口暴露出来

ENV

  • 格式:ENV <key> <value>
  • ENV <key>=<value> …(可以一次设置多个,首选,因为他产生一个缓冲层)
  • 设置环境变量值
  • 您可以使用docker inspect查看,也可以用docker run --env <key>=<value>改变它

ADD

  • 格式:ADD <src>… <dest>
  • ADD ["<src>",… “<dest>”] (这种格式在路径包括空格时被要求)
  • 添加指定文件档容器文件系统
  • src可以是一个相对路径,可以使用通配符
  • des必须是一个绝对路径或者相对于WORKDIR的路径
  • 如果<dest>不存在,则创建所有缺失的目录路径。

COPY

  • 格式:COPY <src>… <dest>
  • COPY ["<src>",… “<dest>”]
  • 复制新文件或目录<src>并将它们添加到容器的文件系统路径<dest>。
  • 可指定多个<src>资源,可以是相对路径,可以使用Go的通配符
  • des必须是一个绝对路径或者相对于WORKDIR的路径
  • 如果<src>是一个目录,目录的整个内容复制,包括文件系统元数据,目录本身不可以被拷贝
  • 如果<dest>不存在,则创建所有缺失的目录路径。

ENTRYPOINT

  • 格式:ENTRYPOINT [“executable”, “param1”, “param2”] (exec格式, 首选)
  • ENTRYPOINT command param1 param2 (shell格式)
  • 允许您配置一个容器并运行
  • 下面将开始nginx的默认内容,监听端口80:docker run -i -t --rm -p 80:80 nginx
  • 将覆盖所有CMD指明的元素
  • 您可以docker run --entrypoint覆盖ENTRYPOINT的指令
  • 只用此命令你的系统可能将失控╮(╯_╰)╭

VOLUME

  • 格式:VOLUME ["/data"]
  • VOLUME /var/log /var/db …
  • 指令创建一个指定挂载点的名称和标志是持有外部挂载卷从本地主机或其他容器

USER

  • 格式:USER <user>[:<group>]
  • USER <UID>[:<GID>]
  • 如果用户没有指定组,镜像将作为root组运行

WORKDIR

  • 格式:WORKDIR /path/to/workdir
  • 设置工作路径,如果不存在将被创建

ARG

  • 格式:ARG <name>[=<default value>]

ONBUILD

  • 格式:ONBUILD [INSTRUCTION]
  • 触发器?

STOPSIGNAL

  • 格式:STOPSIGNAL signal
  • 设置系统呼叫信号将被送到集装箱出口

HEALTHCHECK

  • 格式:HEALTHCHECK [OPTIONS] CMD command (在另一个容器中运行一个命令检查容器健康状况)
  • HEALTHCHECK NONE(禁用任何healthcheck继承了基地的形象)

SHELL

  • 格式:SHELL [“executable”, “parameters”]
  • 覆盖系统默认的SHELL命令,在linux上默认的系统命令是["/bin/sh", “-c”],在window上是[“cmd”, “/S”, “/C”],必须用JSON格式覆盖