暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Dockerfile基本结构和关键字

运维小菜鸡 2019-05-22
345

Dockerfile基本结构和关键字



Dockerfile基本结构

Dockerfile由一行行命令语句组成,并支持以#开头的注释行。例如:

    # This dockerfile uses the ubuntu image
    # VERSION 2 - EDITION 1
    # Author: docker_user
    # Command format: Instruction [arguments command ] ..
    # Base image to use, this nust be set as the first line
    FROM ubuntu
    # Maintainer: docker_user <docker_user at email.com> (@docker_user)
    MAINTAINER docker_user docker_user@email.com
    # Commands to update the image
    RUN echo deb http://archive.ubuntu.com/ubuntu/ raring main universe >> etc/apt/sources.list
    RUN apt-get update && apt-get install -y nginx
    RUN echo \ndaemon off; >> /etc/nginx/nginx.conf
    # Commands when creating a new container
    CMD usr/sbin/nginx

    其中,开始必须指明所基于的镜像名称,接下来一般是说明维护者信息。后面则是镜像操作指令,例如RUN指令,RUN指令将对镜像执行跟随的命令。每运行一条RUN指令,镜像就添加新的一层,并提交。最后是CMD指令,用来指定运行容器时的操作命令。


    Dockerfile关键字

    指令的一般格式为INSTRUNCTION arguments,指令包括FROM、MAINTAINER、RUN等。具体指令及说明如下:

    1

    FROM

    在Dockerfile中FROM主要是指定这个Dockerfile基于哪一个base image构建。Dockerfile是从上往下逐步执行的,每一条指令对应镜像的每一层。一个Dockerfile 必须用FROM指令启动,放在第一行。

      # 为了安全起见,建议使用官方的image作为基础镜像。
      FROM scratch # 制作base image
      FROM centos # 使用base image
      FROM ubuntu:14.04 # 使用指定版本的base image

      2

      LABEL

      在Dockerfile中LABEL实际上是英译了Metadata,就像是代码中的注释。主要包含了该镜像的作者、版本和描述信息。

        LABEL maintainer=staryjie@163.com
        LABEL version=1.0
        LABEL description=This is description

        3

        MAINTAINER

        Dockerfile中MAINTAINER主要用来申明该镜像的维护者信息(姓名/邮箱):

          Maintainerdocker_user <docker_user at email.com> (@docker_user)

          4

          RUN

          在Dockerfile中RUN用来运行命令,其中命令必须是在第一行FROM中指定的base image所能运行的。每运行一次RUN,构建的image都会生成新的一层layer。

            RUN yum update && yum install -y vim \
            python-dev # 反斜杠换行
            RUN apt-get update && apt-get install -y perl \
            pwgen --no-install-recommends && rm -rf \
            /var/lib/apt/lists/* # 注意清理cache
            RUN /bin/bash -C source $HOME/.bashrc;echo $HOME

            为了美观,复杂的RUN可以使用反斜杠换行。

            为了避免无用分层,多条命令尽量合并一行。

            5

            WORKDIR

            在Dockerfile中WORKDIR用来设定当前工作目录,类似Linux系统中的cd命令。

              WORKDIR /root
              WORKDIR /test # 如果没有该目录,则会自动创建
              WORKDIR demo
              RUN pwd # 输出的结果应该是/test/demo

              用WORKDIR,不要使用RUN cd !!!

              为了避免出错,尽量使用绝对路径。

              6

              ADD和COPY

              在Dockerfile中ADD和COPY作用相似,都是把本地的文件添加到docker image中。区别:ADD不仅可以添加文件,还可以解压缩文件,COPY不可以解压缩文件。

                ADD hello /
                ADD test.tar.gz / # 添加到image的根目录并且解压
                WORKDIR /root
                ADD hello test/ # 将hello添加到image的/root/test/hello
                WORKDIR /root
                COPY hello test/ # 跟上面的效果一样

                大部分情况下COPY优于ADD。

                ADD除了COPY还有额外功能(解压)。

                添加远程文件/目录,请使用curl或者wget。

                7

                ENV

                在Dockerfile中ENV来设置环境变量或者一些常量。可以在ENV设置的常量后面直接使用。

                  ENV MYSQL_VERSION 5.6        # 设置常量
                  RUN apt-get install -y mysql-server=${MYSQL_VERSION} && rm -rf /var/lib/apt/lists/* #引用常量

                  尽量使用ENV增加可维护性!

                  8

                  VOLUME

                  在Dockerfile中VOLUME用于向基于镜像创建的容器添加卷,一个卷可以存在于一个或多个容器的特定目录,这个目录可以绕过联合文件系统,并提供共享数据、数据持久化的功能。

                    VOLUME [/data]

                    9

                    EXPOSE

                    在Dockerfile中EXPOSE设置容器暴露的端口,可以指定一个或多个端口。

                      EXPOSE 80

                      虽然在EXPOSE指令中已经暴露了指定的端口,但是在启动容器的时候还是要指定端口信息,容器本身不会自动暴露端口。

                      10

                      ENTRYPOINT

                      在Dockerfile中ENTRYPOINT设置容器启动时运行的命令,可以让容器以应用程序或者服务器的形式运行,而且ENTRYPOINT设定的命令不会被忽略,一定会执行。

                        COPY docker-entrypoint.sh /usr/local/bin/
                        ENTRYPOINT [docker-entrypoint.sh]

                        可以在构建的镜像中写一个启动脚本来作为ENTRYPOINT的入口。

                        12

                        CMD

                        在Dockerfile中CMD设置容器启动后默认执行的命令和参数。如果定义了多个CMD,只会执行最后一个。

                          CMD [executable,param1,param2]        # 执行形式,这是首选形式
                          CMD [param1,param2] # 作为进入点的默认参数
                          CMD command param1 param2 # 壳形式

                          不要定义多个CMD,多个CMD只有最后一个会执行。

                          13

                          HEALTHCHECK

                          检查容器的健康状态。

                          HEALTHCHECK指令有两种形式:

                          HEALTHCHECK [OPTIONS] CMD命令(通过在容器内运行命令来检查容器运行状况)

                          HEALTHCHECK NONE(禁用从基础图像继承的任何健康检查)

                          HEALTHCHECK指令告诉Docker如何测试容器以检查它是否仍在工作。即使服务器进程仍在运行,这也可以检测到陷入无限循环且无法处理新连接的Web服务器等情况。

                          当容器指定了运行状况检查时,除了正常状态外,它还具有运行状况。此状态最初开始。每当健康检查通过时,它就会变得健康(无论以前处于什么状态)。经过一定数量的连续失败后,它变得不健康。

                          可以在CMD之前出现的选项是:

                            --interval = DURATION(默认值:30s)
                            --timeout = DURATION(默认值:30秒)
                            --start-period = DURATION(默认值:0s)
                            --retries = N(默认值:3

                            运行状况检查将首先在容器启动后的间隔秒运行,然后在每次上一次检查完成后再间隔秒。

                            如果单次运行的检查花费的时间超过超时秒数,那么检查将被视为失败。

                            它需要重试连续的健康检查失败才能认为容器不健康。

                            start period为需要时间引导的容器提供初始化时间。在此期间探测失败将不计入最大重试次数。但是,如果在启动期间运行状况检查成功,则会将容器视为已启动,并且所有连续失败将计入最大重试次数。

                            Dockerfile中只能有一个HEALTHCHECK指令。如果列出多个,那么只有最后一个HEALTHCHECK才会生效。

                            CMD关键字之后的命令可以是shell命令(例如HEALTHCHECK CMD / bin / check-running)或exec数组(与其他Dockerfile命令一样;有关详细信息,请参阅例如ENTRYPOINT)。

                            命令的退出状态指示容器的运行状况。可能的值是:

                              0:成功 - 容器健康且随时可用
                              1:不健康 - 容器无法正常工作
                              2:保留 - 不要使用此退出代码

                              例如,要检查每五分钟左右网络服务器能够在三秒钟内为网站的主页面提供服务:

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

                                为了帮助调试失败的探测器,命令在stdout或stderr上写入的任何输出文本(UTF-8编码)都将存储在运行状况中,并可以使用docker inspect进行查询。此类输出应保持较短(目前仅存储前4096个字节)。

                                当容器的运行状况更改时,将生成具有新状态的health_status事件。

                                在Docker 1.12中添加了HEALTHCHECK功能。

                                14

                                USER

                                USER指令设置用户名(或UID)以及可选的用户组(或GID),以便在运行映像时以及Dockerfile中跟随它的任何RUN,CMD和ENTRYPOINT指令时使用。

                                15

                                其他指令

                                Dockerfile中还有许多其他的指令,可以参考Dockerfile官方文档:

                                https://docs.docker.com/engine/reference/builder/



                                留言

                                文章转载自运维小菜鸡,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                评论