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>事先不存在,它將會被自動建立,這包括其父目錄路徑
        例:    
            ~]# 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命令會在卷掛載完成後將此前的全部文件複製到新掛載的卷中
        例:
            VOLUME /data/mysql/                        // 在容器中掛載指定目錄/data/mysql,對應本地則隨機位置
    EXPOSE: 用於爲容器打開指定要監聽的端口以實現外部通訊
        Syntax: EXPOSE <port>[/protocol][<port>[/protocol]...]
                  protocol用於指定傳輸層協議,可爲tcp或udp兩者之一,默認爲tcp協議
          EXPOSE指令可一次指定多個多口,例如
             EXPOSE 11211/udp 11211/tcp
        例:
            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>加引號進行標識;另外,反斜線也可用於續行
            定義多個變量時,建議使用第二種方式,以便在同一層中完成全部功能
        例:
            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
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息