0%

Dockerfile

Dockerfile是一个用来构建镜像的文本文件。

一、基础

      Dockerfile是一个用来构建镜像的文本文件,它包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

  1. 组成

    • 基础镜像信息
    • 维护者信息
    • 镜像操作指令
    • 容器启动时执行指令
    • #为注释内容
  2. 格式

1
2
# Comment
INSTRUCTION arguments
  1. 常用指令

    • FROM:指定基础镜像,并且必须是第一条指令。

      • FROM <image>
      • FROM <image>:<tag>
      • FROM <image>:<digest>
        • <tag><digest>是可选项,默认为latest
    • MAINTAINER:作者信息

      • MAINTAINER <name>
      • 新版docker中使用LABEL指明
    • LABEL:指定标签

      • LABEL <key>=<value> <key>=<value> <key>=<value>...
      • 一个Dockerfile种可以有多个LABEL
      • LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖
    • ADD:把文件复制到镜像中

      • ADD <src>...<dest>
      • ADD ["<src>"..."<dest>"]
      • 路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径,推荐写成绝对路径
      • 可以是一个本地文件或者是一个本地压缩文件,还可以是一个url
      • 如果把src写成一个url,那么ADD就类似于wget命令
      • src如果为一个目录则会自动把目录下的文件复制过去,目录本身不会复制
      • 如果src为多个文件,dest一定要是一个目录
    • COPY:复制命令

      • COPY <src>...<dest>
      • COPY ["<src>"..."<dest>"]
      • COPY的只能是本地文件
    • EXPOSE:暴漏容器运行时的监听端口给外部,不会使容器访问主机的端口

      • EXPOSE /<tcp/udp>
      • 如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上-P参数
    • ENV:设置环境变量

      • ENV <key> <value> 一次一个
      • ENV <key>=<value> ... 一次多个
      • 使用变量
        • $varname
        • ${varname}
        • ${varname:-default value} 变量不存在使用-号后面的值
        • $(varname:+default value} 当变量存在时使用+号后面的值
    • RUN:构件容器时运行的命令

      • RUN <command>
      • RUN ["executable", "param1", "param2"]
    • CMD:容器启动时运行的命令或参数

      • CMD ["executable","param1","param2"]
      • CMD ["param1","param2"]
      • CMD command param1 param2
    • ENTRYPOINT:容器启动时运行得启动命令

      • ENTRYPOINT ["executable", "param1", "param2"]
      • ENTRYPOINT command param1 param2
      • 和CMD对比
        • 都是只能写一条,如果写了多条,那么只有最后一条生效
        • 都是容器启动时才运行
        • ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖
        • 如果在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数
        • 如果在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效
    • VOLUME:可以将宿主机目录挂载到容器中

      • VOLUME ["/data"]
    • USER:启动容器的用户,可以是用户名或UID

    • WORKDIR:设置工作目录,对RUN/CMD/ENTRYPOINT/COPY/ADD生效

    • ARG:设置变量

    • ONBUILD:设置二次构建指令——指定在构建镜像时并不执行而是在它的子镜像中执行。

    • STOPSIGNAL:允许用户定制化运行docker stop时的信号

    • HEALTHCHECK:健康检查指令,用来检查将来容器启动运行时是否正常。

  2. 基本规则

    • Dockerfile中所用的所有文件一定要和Dockerfile文件在同一级父目录下,可以为Dockerfile父目录的子目录
    • Dockerfile中相对路径默认都是Dockerfile所在的目录
    • Dockerfile中能写到一行的指令一定要写到一行,原因是分层构建,联合挂载这个特性。
    • Dockerfile中每一条指令被视为一层

二、实战

三、参考

  1. 参考一
  2. 参考二