美文网首页程序员我用 LinuxDevops
十分钟熟练Dockerfile指令

十分钟熟练Dockerfile指令

作者: 别玩游戏知道吗 | 来源:发表于2018-11-28 22:30 被阅读15次
    • LABLE 给镜像添加元数据信息
    • COPY 用户从宿主机的当前目录复制文件至创建的新映像文件
    COPY <src> <dest>
    COPY ["<src>",..."<dest>"]
    <src>为要复制的源文件或目录,支持使用通配符
    <dest>为目标路径,建议使用绝对路径 
    
    1. <src>必须是build上下文中的路径,不能是其父目录中的文件
    2. 如果<src>是目录,则其内部文件或子目录会被递归复制, 但是<src>目录本身不会被复制

    • ADD 类似于COPY指令,ADD支持使用tar文件和URL路径
    操作如COPY
    

    如果<src>是一个本地系统上压缩格式的tar文件,它降被展开为一个目录,其行为类似 "tar -x"命令,通过url获取到的tar文件将不会自动展开;


    • WORKDIR 用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定工作目录
    WORKDIR /usr/local/
    ADD nginx-1.15.2.tar.gz ./src/
    
    

    • VOLUME

    定义存储卷,只能制定容器内部的目录


    • EXPOSE 用户为容器打开制定要监听的端口以实现与外部通信
    EXPOSE <port>
    EXPOSE 11211/udp 11211/tcp
    

    只有docker run 加 -P选项时才会将端口暴漏出来,如果不加,将不暴漏端口

    [root@cv0002 docker]# docker run --name t1 --rm tinyhttpd:v0.0.6 /bin/httpd -f -h /data/web/html
    [root@cv0002 ~]# docker port t1
    [root@cv0002 ~]#
    
    [root@cv0002 docker]# docker run --name t1 --rm -P tinyhttpd:v0.0.6 /bin/httpd -f -h /data/web/html
    [root@cv0002 ~]# docker port t1
    80/tcp -> 0.0.0.0:1024
    

    • ENV 用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其他指令(如ENV,ADD,COPY等)所调用,调用格式为$variable或${variable}
    ENV <key> <value>或
    ENV <key>=<value> ...
    
    1. 第二种格式可以设置多个变量,若<value>中包含空格,可以使用反斜线转义,也可通过对<value>加引号来标识,反斜线也可以用于续行
    2. 定义多个变量时,建议使用第二种方式,以便在同一层中完成所有功能。
    3. 如果在命令行中定义-e 更改环境变量,也只是更改了环境变量,之前编译时候做的改变是更改不了的。
    [root@cv0002 docker]# docker run --name t1 --rm tinyhttpd:v0.0.7 printenv
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    HOSTNAME=a2c3f68db164
    DOC_ROOT=/data/web/html/
    WEB_SERVER_PACKAGE=nginx-1.15.2
    HOME=/root
    [root@cv0002 docker]# docker run --name t1 --rm -e WEB_SERVER_PACKAGE="nginx-1.15.1" tinyhttpd:v0.0.7 printenv
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    HOSTNAME=27213da32d60
    WEB_SERVER_PACKAGE=nginx-1.15.1
    DOC_ROOT=/data/web/html/
    HOME=/root
    [root@cv0002 docker]# docker run --name t1 --rm -e WEB_SERVER_PACKAGE="nginx-1.15.1" tinyhttpd:v0.0.7 ls /usr/local/src
    nginx-1.15.2
    
    

    RUN和CMD 如图所示

    image
    1. RUN 在docker build中运行,构建镜像时为了使镜像完整使用的命令。在初始化容器时候时不可能再运行。
    2. CMD 定义一个镜像文件启动为容器时候默认要运行的程序,且其运行结束后,容器也将终止,而docker容器默认只运行一个程序。CMD指令可以被docker run 的命令行所覆盖

    注意:RUN命令在Dockerfile中可以有多个,且可以都生效,但是CMD有多个的话,但只有最后一个生效

    • RUN 命令格式
    RUN <command>
    RUN ["<executable>","<param1>","<param2>"]
    
    1. 第一种格式,<command>通常是一个shell命令,且以"/bin/sh -c "来运行它,这意味着此进程在容器中的PID不为1,不能接收unix信号(因为接收信号的都是进程为1的来接收),因此,当使用docker stop <container>命令停止容器时,此京城接收不到sigterm信号;
    2. 第二种语法格式中的参数是一个json格式的数组,其中<executable>为要运行的命令,后面为参数。然而,此格式的命令不会以"/bin/sh -c" 来发起,因此不支持通配符等shell特性

    注意:Json数组中,要使用双引号

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

    • ENTRYPOINT
    1. 类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序
    2. 与CMD不同的是,有ENTRYPOINT启动的程序不会被docker run命令行制定的参数所覆盖,而且,这些命令行参数会被当做参数传递给ENTRYPOINT制定的程序,但会被docker run命令的--entryporint选项的参数可覆盖ENTRYPOINT指令制定的程序
    ENTRYPOINT <command>
    ENTRYPOINT [<"<executable>","<param1>","<param2>">]
    

    注意:docker run传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后作为其参数使用

    注意:Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效


    • USER 用于指定运行的image时的或运行Dockerfile中的任何RUN、CMD、或ENTRYPOINT指令指定的程序时的用户名或UID,默认为root用户
    USER <UID>|<username>
    

    注意:<UID>可以为任意数字,但是事件中必须为/etc/passwd中某用户的有效UID,否则docker run命令将运行失败


    • HEALTHCHECK 检测应用是否正常运行
    HEALTHCHECK --start-period=3s CMD wget -O - -q http://${IP:-0.0.0.0}:${PORT:-80}/
    #3s后开始检查,需要等容器里面的操作全部运行完成再检查
    

    • SHELL 修改或额外定义运行程序的默认shell

    • STOPSIGNAL 更好docker stop 传过来的信号指令,默认为15
    STOPSIGNAL signal
    

    • ARG 只再build中使用,类似变量,可以再docker run的时候通过--build-tag传值,而ENV不可在docker run时传值。

    • ONBUILD 用于在Dockerfile中定义一个触发器(延时执行)
    ONBUILD <指令>
    

    当此Dockerfile被build为映像文件后,此映像文件亦可作为base image被另一个Dockerfile用作FROM指令的参数,并以之构建新的映像文件,此时,ONBUILD后的指令才会执行。

    注意:在ONBUILD指令中使用ADD或COPY指令应该格外小心,因为新构建过程的上下文有可能会缺少源文件

    相关文章

      网友评论

        本文标题:十分钟熟练Dockerfile指令

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