美文网首页
Dockerfile 基本指令

Dockerfile 基本指令

作者: 赛亚人之神 | 来源:发表于2019-03-19 09:17 被阅读0次

    1. RUN

    • 用于指定 docker build 过程中运行的程序,其可以是任何命令
    • Syntax
      • RUN <command>
      • RUN ["<executable", "<param1>", "<param2>"]
    • 第一种语法格式中,<command> 通常是一个 shell 命令,且以 /bin/sh -c 来运行它,这意味着此近程在容器中的 PID 不为 1,不能接收 Unix 信号,因此,当使用 docker stop <container> 命令停止容器时,此进程接收不到 SIGTERM 信号;
    • 第二种语法格式中的参数是一个 JSON 格式的数组,其中 <executable> 为要运行的命令,后面的 <paramN> 为传递给命令的选项或参数;然后此种格式指定的命令不会以 /bin/sh -c 来发起,因此常见的 shell 操作如变量替换以及通配符 ?,*等替换将不会进行;不过,如果要运行的命令依赖于 shell 特性的话,可以将其替换为类似下面的格式
    RUN ["/bin/bash", "-c", "<executable>", "<param1>"]
    

    2. CMD 指令

    • Syntax
      • CMD <command>
      • CMD ["<executable", "<param1>", "<param2>"]
      • CMD ["<param1>", "<param2>"]
    • 前两种语法格式的意义同 RUN
    • 第三种语法则用于 ENTRYPOINT 指令提供默认参数

    3. ENTRYPOINT

    • 类似 CMD 指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序
    • CMD 不同的是,由 ENTRYPOINT 启动的程序不会被 docker run 命令行指定的参数所覆盖,而且,这些命令行参数会被当做参数传递给 ENTRYPOINT 指定的程序
      • 不过, docker run 命令的 --entrypoint 选项的参数可覆盖 ENTRYPOINT 指令指定的程序
    • Syntax
      • ENTRYPOINT <command>
      • ENTRYPOINT ["<executable>", "<param1>", "<param2>"]
    • docker run 命令传入的命令参数会覆盖 CMD 指令的内容并且附加到 ENTRYPOINT 命令最后作为其参数使用
    • Dockerfile 文件中也可以存在多个 ENTRYPOINT 指令,但仅有最后一个会生效

    4. USER

    • 用于指定运行 image 时的或运行 Dockerfile 中任何 RUNCMDENTRYPOINT 指令指定的程序时的用户名或 UID
    • 默认情况下, container 的运行身份为 root 用户
    • Syntax
      • USER <UID> | <UserName>
      • 需要注意的是, <UID> 可以为任意数字,但实践中其必须为 /etc/passwd 中某用户的有效 UID,否则,docker run 命令将运行失败

    4. HEALTHCHECK

    • Syntax

      • HEALTHCHECK [OPTIONS] CMD command,通过在容器中运行 command 命令检测容器健康状态
      • HEALTHCHECK NONE 禁用健康检查
    • options

      • --interval=DURATION(defatult: 30s) 检测时间间隔
      • --timeout=DURATION(defatult: 30s)
      • --start-period=DURATION(defatult: 0s) 开始等待时间,比如,主进程启动需要10秒钟,那么需要修改这个值,大于10s,避免程序启动就开始检测,而这时程序还不可用
      • --retryies=N(defatult: 3s),重试次数
    • command 的 exit status 表明容器的健康状态

      • 0: success
      • 1: unhealthy
      • 2: reserved - do not use this exit code (可以自己定义)
    • 例子(\ 表示换行)

    HEALTHCHECK --interval=5m --timeout=3s \
    CMD curl -f http://localhost/ || exit 1
    

    wget -O - -q www.bauidu.com:这个命令可以把html打印到shell上

    5. SHELL

    如果不是 json 数组格式的指令,默认的 shell 在 Linux 是 ["/bin/sh", "-c"],在 Windows 是 ["cmd", "/S", "/C"]这里的指令用于运行程序默认要运行的 SHELL

    1. shell 指令在 Dockerfile 中必须使用 JSON 格式进行重写
    2. shell 指令可以出现多次,每个 shell 指令覆盖之前的 shell 指令,并且影响后续的指令

    6. STOPSIGNAL
    进程号id 为 1 的,可以接收 docker stop 命令,从而能够停止主进程,从而停止容器。如 stop 发送的是 15,signal 是无符号整型数字(必须匹配 kernal 的 syscall table),如 9 ,也可以是 SIGNAME,如 SIGKILL

    • Syntax
      • STOPSIGNAL signal

    7. ARG
    使用 ARG 指令可以在 docker build 过程中传值,使用 --build-arg <varname>=<value>,如果用户指定的构建参数在 Dockerfile 中未定义,构建会输出警告信息

    • Syntax
      • ARG <name>[=<default value>]

    一个 Dockerfile 中可能包含多个 ARG 指令,一个 ARG 可能包含一个默认值。比如:
    ARG version=1.14
    ARG user=mageedu

    8. ONBUILD

    • 用于在 Dockerfile 中定义一个触发器
    • Dockerfile用于 build 镜像文件,此镜像文件可以作为 base image 被另一个 Dockerfile 用做 FROM 指令的参数,并以只构建新的镜像文件
    • 在后面的这个 Dockerfile 中的 FROM 指令在 build 过程中被执行时,将会“触发”创建其 base imageDockerfile 文件中 ONBUILD 指令定义的触发器
    • Syntax
      • ONBUILD <INSTRUCTION>
    • 尽管任何指令都可以注册成为触发器指令,但 ONBUILD 不能自我嵌套,且不会触发 FROMMAINTAINER 指令
    • 使用包含 ONBUILD 指令的 Dockerfile 构建的镜像应该使用特殊的标签,例如 ruby:2.0-onbuild
    • ONBUILD 指令中使用 ADDCOPY 指令应该格外小心,因为新构建过程的上下文在缺少指定原文件时会失败

    相关文章

      网友评论

          本文标题:Dockerfile 基本指令

          本文链接:https://www.haomeiwen.com/subject/acmwmqtx.html