美文网首页
docker学习(十)Dockerfile指令学习

docker学习(十)Dockerfile指令学习

作者: 吃猫的鱼0 | 来源:发表于2018-02-02 11:22 被阅读0次

    dockerfile指令

    dockerfile指令格式

    注释: #Commet(#开头)
    
    指令: INSTRUCTION argument (大写指令开头 参数)
    

    1.FROM

    FROM <IMAGE> OR FROM <IMAGE>:<TAG>
    

    必须以存在的镜像
    基础镜像
    必须是第一条非注释指令

    2.MAINTAINER

    MAINTAINER <NAME>
    

    制定作者信息,包含作者的所有者和联系信息

    3.RUN

    指定镜像中运行的命令.每一个RUN指令都会在当前镜像的上层新建一个镜像

    RUN <COMMAND>  (shell 模式)
    

    以/bin/sh -c command 的形式执行命令

    RUN ["executable","param1","parm2"] (exec 模式)
    

    可以指定其他形式的sh 来运行指令.例:RUN ["/bin/bash","-c","echo hello"]

    4.EXPOSE

    指定运行该容器所使用的端口

    EXPOSE <port>or[port...]
    

    容器运行时还是要去在使用时在run 命令中添加对端口的使用

    5.容器运行时运行的命令

    CMD

    用来提供容器运行的默认命令,与RUN指令类似,都是执行一个命令,但是RUN指令指定的命令实在镜像构建的时候运行的.而cmd指定的命令是在容器运行的时候运行的.并且当我们使用docker run命令启动一个容器的时候,如果制定了容器运行的命令,那么CMD当中的指令会被覆盖,不会执行.也就是说:cmd是用来指定容器的默认行为.

    CMD ["executable","param1","parm2"] (exec模式)
    CMD command param1 param2 (shell模式)
    CMD ["param1","parm2"] (作为ENTRYPOINT指令的默认参数)
    

    例子:

    CMD ["/usr/sbin/nginx","-g","deamon off"]
    

    ENTERYPOINT

    (不会被docker run 命令中的启动命令所覆盖,如果需要覆盖的话可以使用:docker run --entrypoint 覆盖)

    例子:
    ENTERYPOINT ["/usr/sbin/nginx","-g","deamon off"]

    组合使用的方式
    用ENTERYPOINT指定命令,用CMD指定参数
    这时候可以在docker run 中指定参数

    6.设置镜像的目录和文件

    ADD

    COPY

    都是将文件复制到使用dockerfile构建的镜像中,都支持两种参数,来源地址和目标地址.

    ADD <SRC> <DEST>
    ADD ["SRC" "SEST"](适用于文件路径中有空格的情况)
    COPY <SRC> <DEST>
    COPY ["SRC" "SEST"](适用于文件路径中有空格的情况)
    

    来源地址:可以是本地地址,也可以是远程的URL,如果是本地地址,那必须是构建本地的相对地址,
    目标地址:镜像中的绝对路径.单纯的复制,推荐使用copy

    VOLUME

    VOLUME ["/data"]
    

    用来向给予镜像创建的容器添加卷,一个卷是可以存在一个或多个容器的特定目录.这个目录可以绕过联合文件系统.并提供如共享数据,提供数据持久化的功能,

    7.设置镜像的目录和文件

    WORKDIR

    这个指令用来在从镜像创建一个新容器时,在容器内部设置工作目录,ENTERYPOINT或者cmd都会指定在这个目录下执行.我们也可以使用这个指令在构建中为后续的指令指定工作目录.(通常会使用绝对路径,如使用相对路径,呢么工作路径会一直传递下去.)
    例子:

    WORKDIR /a
    WORKDIR b
    WORKDIR c
    结果:/a/b/c
    

    ENV

    用来设置环境变量,环境变量的指令也可以作用于构建过程中以及运行过程中同样有效.
    ENV <KEY> <VALUE>
    ENV <KEY>=<VALUE>...同时设置多个

    USER

    用来指定镜像会以什么样的用户取运行.
    USER DEAMON

    例子:

    USER nginx//基于该镜像启动的容器就会以nginx的身份来运行
    

    我们也可以在USER命令中使用 uid ,用户组,gid,这四种的任意组合.如果不使用USER命令,默认会使用root用户.

    8.ONBUILD

    能够为镜像添加触发器:当一个镜像被其他镜像作为基础镜像时执行.当子镜像构建时会插入触发器当中的指令.

    ONBUILD [INSTRUCTION]
    

    例子:

    ONBUILD COPY index.html /user/share/nginx/html/
    

    Dockerfilef构建过程

    创建的过程

    1.从基础镜像运行一个容器。
    2.执行一条指令,对容器做出修改。
    3.执行类似docker commit的操作,提交一个新的镜像层。
    4.根据新的镜像层运行一个新的容器。
    5.执行dockerfile的下一条指令,直至所有的指令执行完毕。

    创建过程特点

    会删除中间层创建的容器,不会删除中间层创建的镜像。
    这就使我们可以使用中间层镜像进行调试。(可以使我们逐一排查错误产生的位置)

    构建缓存

    由于每一步的构建结果都会提交为镜像。所以,docker的构建过程就可以非常的聪明,他会将之前的镜像看做缓存。这就可以使构建的过程非常的高效。

    这时,如果吧之前构建镜像的步骤再执行一遍的话,就没有以前那么缓慢。同时,会显示Using cache(使用了缓存)的字样。

    不使用缓存

    方法一:
    --no-cache选项不使用缓存

    docker build --no-cache
    

    方法二:
    第三个命令处使用环境变量 ENV REFRESH_DATE 2018-01-01,来标识缓存刷新的时间,修改这个命令,就可以保证后面的缓存刷新。

    #First Dockerfile
    FROM ubuntu:14.04(镜像的基础)
    MAINTAINER zhiyuan(镜像的维护人) "zhiyuan@outlook.com" (维护人的联系方式)
    ENV REFRESH_DATE 2018-01-01
    RUN apt-get update (执行的命令)
    RUN apt-get install -y nginx (执行的命令)
    EXPOSE 80 (暴露的端口)
    

    查看镜像的构建过程

    docker history [image]
    

    例子:

    docker history text1
    

    相关文章

      网友评论

          本文标题:docker学习(十)Dockerfile指令学习

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