Dockerfile基本指令
阿新 • • 發佈:2018-11-09
Dockerfile中常用命令:
語法組成: 1 註釋資訊 2 指令---引數 [通常要大寫|實質上不區分大小寫] 3 順序執行 4 第一個非註釋行必須是from [基於那個基礎映象製作] 5 需要一個專用目錄[自己建立] 6 首字目必須大寫---Dockerfile 7 製作映象依賴到檔案或者包組時,必須提前準備至專用目錄下 .dockerignore file --每一行中定義一個忽略檔案 --建立在工作目錄中 例如:pam.d/su* ......................................................... dockerfile中的常用指令: 1 FROM ---指定基礎映象 基礎映象不存在會在Docker Hub上拉去 使用格式: FROM <映象>:[tag] FROM <映象>@digest[校驗碼] 當前主機沒有此映象時,會自動去官網HUB下載 .............................................. 2 MAINTANIER --提供Dockerfile 製作者提供本人資訊 [逐漸廢棄] LABLE --替代MAINTANIER 具體使用: LABLE maintainer="作者資訊" 使用格式: MAINTANIER "guowei <
[email protected]>" ....................................................... 3 COPY --把宿主機中的檔案複製到映象中去! 檔案要在Dockerfile工作目錄 src 原檔案 --支援萬用字元 --通常相對路徑 dest 目標路徑 --通常絕對路徑 有空白字元隔開的字串需要用"",否則會被當做兩個檔案! 檔案複製準則: 1 src必須是build上下文中的路徑,不能是其父目錄 2 如果src是目錄,則其內部檔案或子目錄會被遞迴複製 但src目錄自身不會被複制 3 如果指定了多個src,或在src中使用了萬用字元,則dest必須是一個 目錄,且必須以/結尾 4 如果dest實現不存在,它將會被自動建立,這包括其父目錄 .............................................................. 4 ADD --類似COPY命令 支援URL路徑----如果可以訪問網路的話,會訪問網路下載 到本地然後打包進映象! 操作準則: 1 如果src為URL且dest不以/結尾,則src指定的檔案將被下載並 直接被建立為dest;如果dest以/結尾,則檔名URL指定的檔案 將被直接下載並儲存為dest/filename 2 如果是壓縮包會被解壓,但通過URL路徑獲取到的tar檔案不會被展開 3 如果src有多個,或其間接或直接使用了萬用字元,則dest必須是一個 以/結尾的目錄路徑,如果dest不以/結尾,則其被視為一個普通檔案 src的內容將被直接寫入到dest中! ............................................................... 5 WORKDIR --指定工作目錄 每次只會影響這個指令後續的指令 ADD nginx-1.14.2.tar.gz /usr/local/src/ --不受影響 WORKDIR /usr/local/src/ ADD nginx-1.14.2.tar.gz ./ --受影響 ............................................................. 6 VOLUME --卷 只能定義docker管理的卷: VOLUME /data/mysql 執行的時候會隨機在宿主機的目錄下生成一個卷目錄! ................................................................ 7 EXPOSE 為容器開啟指定要監聽的埠以實現與外部通訊 使用格式: EXPOSE 80/tcp 23/udp 不加協議預設為tcp 使用-P選項可以暴露這裡指定的埠! 但是宿主的關聯至這個埠的埠是隨機的! .............................................................. 8 ENV 用於為映象定義所需的環境變數,並可被Dockerfile檔案中位於 其後的其它命令所呼叫 呼叫格式: $A 或 ${A} ENV <key> <value> ENV <key>=<value> 第一種格式中,key之後的所有內容均會被其視作<value>的組成部分 因此,一次只能設定一個變數! 第二種格式可用一次設定多個變數,每個變數為一個<key>=<value> 的鍵值對,如果<value>中包含空格,可以反斜線(\)進行轉義 也可以通過對<value>加引號進行標識。另外,反斜線也可用於續航 定義多個變數時。建議使用第二種方式,以便在同一層中完成所有功能 具體用法: ENV JAVA_HOME /usr/local/jdk ENV JRE_HOME $JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/ ENV PATH $PATH:$JAVA_HOME/bin/ ENV A /web/html COPY index.html ${A:-/web/html} 在docker run 中傳遞變數: docker run -e [list] 傳變數值 如果在dockerfile中賦值變數後也能在docker run中繼續賦值 docker run --name b1 --rm -e A=xx [映象ID] 不會影響docker build 的過程! printenv --輸出環境變數資訊 .............................................................. 9 RUN命令: 使用格式: RUN <command> RUN ["<executable>","<param1>","<param2>"] 第一種格式中 <command命令通常是一個shell命令 且以"/bin/sh -c">來執行它 這意味此程序在容器中的PID不能為1,不能接收Unix訊號,因此,當使用docker stop命令 來停止容器時,此程序接收不到訊號 第二種語法格式中的引數是一個JSON格式的陣列,其中<executable>為要執行的命令,後面的 <paramN>為傳遞給命令的選項或引數,然而,此種格式指定的命令不會以"/bin/sh -c">來執行它 因此常見的shell操作如變數替換以及萬用字元替換將不會進行 不過如果要執行的命令依賴於 此shell特性的話,可以將其替換為下面的格式: RUN ["/bin/bash","-c","<executable>","<param1>"] ........................................................................ 10 CMD命令:運行於docker run中 語法有三種寫法 1. CMD ["executable","param1","param2"] --啟動為ID為1的程序 具體例項: CMD ["/bin/sh","-c","/bin/httpd","-f","-h /web/html] 2. CMD ["param1","param2"] 3. CMD command param1 param2 --直接運營為shell的子程序 param*=執行引數 例如第二種: CMD ["nginx"] docker run -it -p 8888:80 172.20.23.31/server1/nginx-base:v1 nginx 只能是雙引號! CMD ["param1","param2"] --此種用法用於為ENTRYPOINT指令提供預設引數 可用於執行指令碼: 新增指令碼: ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh RUN chmod +x /apps/tomcat/bin/run_tomcat.sh RUN chown -R tomcat:tomcat /apps /data/tomcat CMD ["/apps/tomcat/bin/run_tomcat.sh"] -- 引用指令碼! .............................................................. 11 ENTRYPOINT 類似CMD指令的功能,用於為容器指定預設執行程式,從而使得容器像是一個單獨 的可執行程式 與CND不同的是,由這個指令啟動的程式不會被docker run 命令列指定的引數所覆蓋 而且,這些命令列引數會被當做引數傳遞給ENTRYPOINT指定的程式 使用格式: ENTRYPOINT <command> ENTRYPOINT ["<executable>","<param1>","<param2>"] docker run 命令傳入的命令引數會覆蓋CMD指定的內容並且附加到ENTRYPOINT 命令最後作為其引數使用 Dockerfile檔案中也可以存在多個此指令,但僅有最後一個生效! 在docker run時,使用--entrypoint string選項傳遞的命令 可以覆蓋Dockerfile中 定義的ENTRYPOINT指令 如何讓Nginx配置檔案接收引數 建立一個指令碼: #!/bin/bash # cat > /etc/nginx/conf.d/www.conf <<EOF server { server_name ${HOSTNAME}; listen ${IP:-0.0.0.0}:${PORT:-80}; root ${ROOT:-/web/html}; } EOF exec "[email protected]" chmod +x nginx-conf.sh Dockerfile檔案: FROM xxx ENV ROOT='/web/html/' ADD index.html ${ROOT} ADD nginx-conf.sh /bin/nginx-conf.sh CMD ["/usr/sbin/nginx","-g","daemon off;"] ENTRYPOINT ["/bin/nginx-conf.sh"] docker run --name b1 --rm -P -e "PORT=8080" [映象ID] 注意:必須使用雙引號!!! ................................................................................ 12 USER命令: 用於指定執行image時的或執行Dockerfile中的任何RUN,CMD或ENTRYPOINT 指令指定的程式時的使用者名稱或UID 預設情況下,container的執行身份為root 格式: USER <UID>|<UserName> 需要注意的是<UID>可以為任意數字,但實踐中其必須為/etc/passwd中某使用者的有效 UID否則docker run命令將執行失敗! 必須要在容器中的/etc/passwd檔案中個存在 .................................................................... 13 HEALTHCHECK 健康狀態監測 HEALTHCHECK NONE --不要做監測 常用選項: --interval=DURATION 預設30秒 --多長時間監測一次 --timeout=DURATION 預設30秒 --監測超時時間 --start-period=DURATION --當docker容器啟動後,延遲多長時間才健康檢查 預設0秒 --retries=N 預設3次 預設檢查多少次在認為失敗 響應值: 0--成功 1--失敗 2--自定義 應用示例: HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit1 Dockerfile中應用: HEALTHCHECK --start-period=3s CMD wget -O - -q http://{IP:-0.0.0.0}:${PORT:-80}/ 也可以在docker run中定義: --health-cmd string --health-interval duration --health-retries int --health-start-period duration --health-timeout duration ................................................................. 14 SHELL指令: ["cmd","/S","/C"] --windons ........................................................... 15 STOPSIGNAL命令: STOPSIGNAL 訊號名稱 定義停止命令的訊號! SIGKILL --9訊號 ............................................................. 16 ARG引數: 用於docker build 的過程中使用 可以被--buil-arg當做引數傳遞過來! 具體應用: ARG auther=tim LABLE maintainer=${auther} docker build --build-arg auther=tom -t xxx ./ 在dockerfile中存在的arg變數,如果在docker build 時也 設定了--build-arg變數,這樣最終以命令列介面的變數值為 最終值! ................................................................. 17 ONBUILD 用於在dockerfile中定義一個觸發器 dockerfile用於build映像檔案,此映像檔案亦可作為base image被另一個 dockerfile用作from指定的引數,並以之構建新的影響檔案 在後面的這個dockerfile中的from指定在build過程中被執行時,將會觸發 建立其base image的dockerfile檔案的ONBUILD指定定義的觸發器 格式: ONBUILD 要執行的Dockerfile指令 儘管任何指令都可註冊成為觸發器指令,但ONBUILD不能自我巢狀 且不會觸發from和maintainer指令 使用包含onbuild指定的dockerfile構建的映象應該使用特殊的標籤 例如ruby:2.0-onbuild 在onbuild指令中使用add或copy指令硬格外小心,因為構建過程的上下文 在缺少指定的原始檔時會失敗! 會在別人引用這個映象時執行!並不會在首次build過程執行