Welcome to the K-free blog;|

k-free

园龄:5年8个月粉丝:5关注:7

Dockerfile

Dockerfile    

    FROM:
        基于哪个镜像上层做新的镜像
  第一行要求为FROM <image>:<tag>
 
    LABEL: 让用户为镜像指定各种各样的元数据(docker新版本所支持)
    MAINTAINER: 相同功能,1.8版本前都支持
        Syntax: LABEL <key>=<value> <key>=<value> <key>=<value>
 
    COPY: 将宿主机中文件打包提供(复制)到目标镜像中
        Syntax: COPY <src>...<dest>或
                  COPY ["<src>"...."<dest>"]
                      dest: 生成目标目录的路径
                      src: 要复制的源文件或目录,支持使用通配符,建议使用绝对路径,否则,COPY指定则以WORKDIR为起始路径
 
                注意:
                    <src>必须是build上下文中的路径,不能是其父目录中的文件
                    如果<src>是目录,则其内部文件或子目录会被递归复制,但<src>目录自身不会被复制
                    如果指定了多个<src>,或在<src>中使用了通配符,则<dest>必须是一个目录,且必须以"/"结尾
                    如果<dest>事先不存在,它将会被自动创建,这包括其父目录路径
        例:    
1
2
3
4
5
6
7
8
9
~]# mkdir /app/docker
~]# vim Dockerfile
    FROM busybox:latest
    MAINTAINER "Fangwenkai"
    COPY ["index.html","/data/web/html/"]        // 复制单个文件到景象中/data/web/html中保留
    COPY ["yum.repos.d","/etc/yum.repos.d/"]    // 复制本地yum.repos.d下的所有文件到新镜像中保留,因为src为目录,所以dest要以/结尾
~]# docker build -t httpd:latest ./             // 构建
~]# docker images
  httpd               latest              502b9f32b549        10 minutes ago      1.21MB
    ADD: 类似于COPY命令,ADD支持使用TAR文件和URL路径
        Syntax: ADD <src>..<dest>或
                  ADD ["<src>"..."<dest>"]
 
            注意:
                同COPY指令
                如果<src>为URL且<dest>不以"/"结尾,则<src>指定的文件将被下载并直接创建为<dest>;如果<dest>以"/"结尾,则文件名URL指定的文件将直接下载并保存为<dest>/<filename>
                如果<src>是一个本地系统上的压缩格式的tar文件,它将被展开为一个目录,其行为类似与"tar -x"命令;然后,通过URL获取到的tar文件将不会自动展开
                如果<src>有多个,或其间接使用了通配符,则<dest>必须是一个以"/"结尾的目录路径;如果<dest>不以"/"结尾,则其被视作一个普通文件,<src>的内容将本直接写入到<dest>
        例:
       ADD ["http://nginx.org/download/nginx-1.17.0.tar.gz","/usr/local/src/"]   // 即使dest不存在也会自动创建,src为URL光下载不解压
       ADD ["nginx-1.17.0.tar.gz","/usr/local/src/nginx/"]               // 会将压缩包展开放在指定目录中
    WORKDIR: 用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定设定工作目录
        Syntax: WORKDIR <dirpath>
            在Dockerfile文件中,WORKDIR指令可出现多次,其路径也可以为相对路径,不过,其是相对此前一个WORKDIR指令指定的路径
            另外,WORKDIR也可调用由ENV指定定义的变量
            例如:
                WORKDIR /var/log
                WORKDIR $STATEPATH
        例:
            WORKDIR /usr/local/src
            ADD ["nginx-1.17.0.tar.gz","./"]           // 此时的当前目录变为/usr/local/src
    VOLUME: 用于在image中创建一个挂载点目录,以挂载Docker host上的卷或其它容器上的卷
        Syntax: VOLUME<mountpoint>或
                  VOLUME["<mountpoint>"]
            如果挂载点目录路径下此前在文件存在,docker run命令会在卷挂载完成后将此前的所有文件复制到新挂载的卷中
        例:
1
VOLUME /data/mysql/                        // 在容器中挂载指定目录/data/mysql,对应本地则随机位置
    EXPOSE: 用于为容器打开指定要监听的端口以实现外部通信
        Syntax: EXPOSE <port>[/protocol][<port>[/protocol]...]
                  protocol用于指定传输层协议,可为tcp或udp二者之一,默认为tcp协议
          EXPOSE指令可一次指定多个多口,例如
             EXPOSE 11211/udp 11211/tcp
        例:
1
2
    EXPOSE 80/tcp                  // 指定容器内打开的端口
~]# docker run --name h4 --rm -P httpd:v0.1-6 /bin/httpd -f -h /data/web/html  // 添加"-P"即可在宿主机暴露随机端口
    ENV: 用于为镜像定义所需要的环境变量,并可被Dockerfile文件中位于其后的其他指令(如ENV、ADD、COPY等)所调用
          调用格式为$variable_name或${variable_name}
        Syntax:
            ENV <key> <value>或
            ENV <key>=<value>...
            第一种格式中,<key>之后的所有内容均会被视作其<value>的组成部分,因此,一次只能设置一个变量
            第二种格式可以用一次设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<value>中包含空格,可以以反斜线(\)进行转移,也可通过对<value>加引号进行标识;另外,反斜线也可用于续行
            定义多个变量时,建议使用第二种方式,以便在同一层中完成所有功能
        例:
1
2
3
4
5
6
    ENV DOC_ROOT=/data/web/html/ \
        WEB_SERVER_PACKAGE=nginx-1.17.0.tar.gz
    COPY ["index.html","$DOC_ROOT:-/data/web/html/"// $DOC_ROOT:-/data/web/html(当$DOC_ROOT没有值时则使用-后面的值)
    ADD ["$WEB_SERVER_PACKAGE","./"]
~]# docker run --name h5 --rm -P -e WEB_SERVER_PACKAGE=nginx-1.17.1.tar.gz httpd:v0.1-7 printenv
    -e: 修改env全局环境变量
    RUN: 用于指定docker build过程中运行的程序,其可以是任何命令
        Syntax:
            RUN <command>或
            RUN ["<executable>","<paraml>","<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>","<paraml>"]
        例:
复制代码
            FROM busybox:latest
            MAINTAINER "Fangwenkai"
            ENV DOC_ROOT=/data/web/html/ \
                WEB_SERVER_PACKAGE=nginx-1.17.0.tar.gz
            COPY ["index.html","$DOC_ROOT:-/data/web/html/"]
            COPY ["yum.repos.d","/etc/yum.repos.d/"]
            ADD ["http://nginx.org/download/$WEB_SERVER_PACKAGE","/usr/local/src/"]
            WORKDIR /usr/local/src
            #ADD ["$WEB_SERVER_PACKAGE","./"]
            VOLUME /data/mysql/
            EXPOSE 80/tcp
            RUN cd /usr/local/src && \                           // 在build过程中进入到指定目录并解压nginx-1.17.0.tar.gz
                tar -xf $WEB_SERVER_PACKAGE
复制代码
    CMD: 类似与RUN指令,CMD指令也可用于运行任何命令或应用程序,不过,二者的运行时间点不同
            RUN指令运行于映像文件构建过程中,而CMD指令云星宇基于Dockerfile构建出的新映像文件启动一个容器时
            CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器将终止;不过,CMD指定的命令其可以被docker run的命令行选项所覆盖
            在Dockerfile中可以存在多个CMD指令,但仅最后一个会生效
        Syntax:
            CMD <command>或
            CMD ["<executable>","<param1>","<param2>"]或
            CMD ["<param1>","<param2>"]
                前两种语法格式的意义同RUN
                第三种则用于为ENTRYPOINT指令提供默认参数
 
    ENTRYPOINT: 类似CMD指令的功能,用于为容器指定默认执行程序,从而使得容器像是一个单独的可执行程序
                与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当做参数传递给ENTRYPOINT指定的程序
                    不过,docker run命令的--entrypoint选项的参数可覆盖ENTEYPOINT指令所指定的程序
        Syntax:
            ENTRYPOINT <command>
            ENTRYPOINT ["<executable>","<param1>","<param2>"]
            docker run命令传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后作为其参数使用
            Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个生效
 
    USER: 用于指定运行image时的或运行Dockerfile中任何RUN、CMD或ENTRYPOINT指令指定的程序时的用户名或UID;默认情况下,container的运行身份为root用户
        Syntax:
            USER <UID>|<USERNAME>
            需要注意的是,<UID>可以为任意数字,但实践中其必须为/etc/passwd中某用户的有效UID,否则,docker run命令将运行失败
 
    HEALTHCHECK: 容器健康状况检查命令
        Syntax:
            HEALTHCHECK [OPTIONS] CMD command
            HEALTHCHECK NONE
                第一个的功能是在容器内部运行一个命令来检查容器的健康状况
                第二个的功能是在基础镜像中取消健康检查命令
        [OPTIONS]:
            --interval=DURATION(default:30s)          // 两次检查默认的时间间隔为30s
            --timeout=DURATION(defaul:30s)            // 健康检查命令运行超时时长,默认为30s
            --start-period=DURATION(default:0s)        // 当容器启动多长时间后运行健康检查,默认不等待
            --retries=N(default:3)                    // 检查几次
 
        注意:
            HEALTHCHECK命令只能只能出现一次,如果出现了多次,只有最后一个生效
 
        CMD后边的命令的返回值决定了本次健康检查是否成功,返回值如下
            0: success - 表示容器是健康的
            1: unhealth - 表示容器已经不能工作了
            2: reserved - 保留值
        例:
            HEALTHCHECK --interval=5s --timeout=3s --start-period=5s \
            CMD wget -O - -q $HOSTNAME || exit 1
    SHELL: 允许覆盖用于shell形式的命令的默认shell,Linux上的默认shell是/bin/sh -c,而在windows上为cmd /s /c
        Syntax:
             SHELL ["executable","parameters"]
                SHELL指令必须以JSON格式写入Dockerfile
                SHELL指令可以多次出现,每条SHELL指令都会覆盖所有先前的SHELL指令,并影响所有后续指令
 
    ARG: 设置变量命令,ARG命令定义了一个变量,在docker build创建镜像的时候,使用 --build-arg <varname>=<value>来指定参数
             如果用户在build镜像时指定了一个参数没有定义在Dockerfile中,那么将有一个Warning
        例:
            ARG author="xiaofang"              // 定义变量所有者为"xiaofang"
            LABEL maintainer="${author}"        // 调用author变量,最后inspect会查看到所有者为"xiaofang"
    ONBUILD:
        用于在Dockerfile中定义一个触发器
        Dockerfile用于build映像文件,此映像文件亦可作为base image被另一个Dockerfile用作FROM指令的参数,并以之构建新的映像文件
        在后面的这个Dockefile中的FROM指令在build过程中被执行时,将会"触发"创建其base image的Dockerfile文件中的ONBUILD指令定义的触发器
        Syntax:
             ONBUILD <INSTRUCTION>
                尽管任何指令都可注册成为触发器指令,但ONBUILD不能自我嵌套,且不会触发FROM和MAINTAINER指令
                使用包含ONBUILD指令的Dockerfile构建的镜像应该使用特殊的标签,例如ruby:2.0-onbuil
                在ONBUILD指令中使用ADD或COPY指令应该格外小心,因为新构建过程的上下文在缺少指顶的源文件时会失败
 
        例:
复制代码
            ~]# vim /docker/image3/Dockerfile
                ....
                ONBUILD ADD http://nginx.org/download/nginx-1.16.0.tar.gz /usr/local/src/
                ....
            image3]# docker build ./ -t myweb:v0.3-10
            image3]# mkdir ../image4/; cd ../image4
            image4]# vim Dockerfile
                FROM myweb:v0.3-10                          // 引用刚刚带有ONBUILD构建的镜像
                RUN mkdir /test                             // 创建/test目录
            image4]# docker build ./ -t test:v0.1-onbuild    // 执行后会发现这个镜像会下载上一个Dockerfile中ONBUILD后的URL
复制代码
 
 

本文作者:k-free

本文链接:https://www.cnblogs.com/k-free-bolg/p/11051769.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   k-free  阅读(229)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 新時代 (ウタ from ONE PIECE FILM RED) Ado
新時代 (ウタ from ONE PIECE FILM RED) - Ado
00:00 / 00:00
An audio error has occurred.

作词 : 中田ヤスタカ

作曲 : 中田ヤスタカ

新時代はこの未来だ

世界中全部 変えてしまえば

変えてしまえば

ジャマモノ やなもの なんて消して

ジャマモノ やなもの なんて消して

この世とメタモルフォーゼしようぜ

ミュージック

キミが起こす マジック

目を閉じれば未来が開いて

目を閉じれば未来が開いて

いつまでも終わりが来ないようにって

この歌を歌うよ

Do you wanna play? リアルゲーム ギリギリ

Do you wanna play? リアルゲーム ギリギリ

綱渡りみたいな旋律

認めない戻れない忘れたい

夢の中に居させて I wanna be free

見えるよ新時代が 世界の向こうへ

さあ行くよ NewWorld

新時代はこの未来だ

新時代はこの未来だ

世界中全部 変えてしまえば

変えてしまえば

果てしない音楽がもっと届くように

夢は見ないわ キミが話した

「ボクを信じて」

あれこれいらないものは消して

あれこれいらないものは消して

リアルをカラフルに越えようぜ

ミュージック

今始まる ライジング

目をつぶりみんなで逃げようよ

目をつぶりみんなで逃げようよ

今よりイイモノを見せてあげるよ

この歌を歌えば

Do you wanna play? リアルゲーム ギリギリ

Do you wanna play? リアルゲーム ギリギリ

綱渡りみたいな運命

認めない戻れない忘れたい

夢の中に居させて I wanna be free

見えるよ新時代が 世界の向こうへ

さあ行くよ NewWorld

新時代わ この未来を

新時代わ この未来を

世界中全部 変えてしまえば 変えてしまえば

果てしない音楽がもっと届くように

夢を見せるよ 夢を見せるよ

新時代だ

新時代だ

新時代だ