Dockerfile镜像配置

DockerFile 的常用指令

玖涯

指令介绍

  • FROM:指定基础镜像
  • RUN:在镜像上执行命令
  • CMD:容器启动时默认执行的命令
  • ENTRYPOINT:配置容器启动时运行的命令
  • LABEL:为镜像添加元数据标签
  • EXPOSE:声明运行容器时应该暴露的端口
  • ENV:设置环境变量
  • ADD:将本地文件添加到镜像中
  • COPY:将本地文件复制到镜像中
  • WORKDIR:设置工作目录
  • USER:指定运行容器时的用户
  • VOLUME:创建一个可以从本机或其他容器挂载的挂载点
  • ONBUILD:当一个被继承的Dockerfile中使用,其父镜像在被pulled时触发

指令语法

  • FROM 指定基础镜像

    1
    2
    3
    4
    5
    FROM <image>
    # 或
    FROM <image>:<tag>
    # 或
    FROM <image>:<digest>
  • RUN 执行命令

    • RUN 指令在镜像的构建过程中执行特定的命令,并生成一个中间镜像。
    • 语法格式如下(有两种格式):
      • shell 格式:
        1
        2
        RUN <命令行命令>
        # <命令行命令> 等同于,在终端操作的 shell 命令。
      • exec 格式:
        1
        2
        3
        4
        RUN ["可执行文件", "参数1", "参数2"]
        # 例如:
        # RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

  • COPY 复制文件

    • 复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
    • 语法格式如下:
      1
      2
      3
      4
      5
      6
      7
      8
      COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
      COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]

      COPY hom* /mydir/
      COPY hom?.txt /mydir/

      <目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

    • <源路径> 可以是多个,甚至可以是通配符,其通配符规则要满足 Go 的 filepath.Match 规则,如
      1
      2
      3
      COPY hom* /mydir/
      COPY hom?.txt /mydir/

    • <目标路径> 可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用 WORKDIR 指令来指定)。目标路径不需要事先创建,如果目录不存在会在复制文件前先行创建缺失目录。
  • ADD 更高级的复制文件

  • CMD

    • 类似于 RUN 指令,用于运行程序,但二者运行的时间点不同
      • CMDdocker run 时运行,在构建时不进行任何操作。
      • RUN 是在 docker build,并生成一个新的镜像。
    • 作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
    • 注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效
    • 语法格式如下(有三种格式):
      1
      2
      3
      4
      CMD <shell 命令> 
      CMD ["<可执行文件或命令>","<param1>","<param2>",...]
      CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

  • ENTRYPOINT

  • ENV 设置环境变量

  • ARG

  • VOLUME 定义匿名卷

    • 定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷
    • 作用:
      • 避免重要的数据,因容器重启而丢失,这是非常致命的。
      • 避免容器不断变大。
    • 语法格式如下:
      1
      2
      3
      VOLUME ["<路径1>", "<路径2>"...]
      VOLUME <路径>

    • 在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点
  • EXPOSE

    • 为构建的镜像设置监听端口,使容器在运行时监听(仅仅只是声明端口)。
    • 作用:
      • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
      • 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
    • 语法格式如下:
      1
      2
      EXPOSE <port> [<port>...]

    • EXPOSE 指令并不会让容器监听 host 的端口,如果需要,需要在 docker run 时使用 -p、-P 参数来发布容器端口到 host 的某个端口上
  • WORKDIR 指定工作目录

    • 指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录
    • docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
    • 语法格式如下:
      1
      2
      WORKDIR <工作目录路径>

    • 通过 WORKDIR 设置工作目录后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT、ADD、COPY 等命令都会在该目录下执行。
    • 例如,使用 WORKDIR 设置工作目录:
      1
      2
      3
      4
      5
      WORKDIR /a
      WORKDIR b
      WORKDIR c
      RUN pwd

    • 在以上示例中,pwd 最终将会在 /a/b/c 目录中执行。在使用 docker run 运行容器时,可以通过 -w 参数覆盖构建时所设置的工作目录。
  • HEALTHCHECK

  • ONBUILD

  • LABEL

  • STOPSIGNAL

  • SHELL