1. 程式人生 > 資訊 >4399 元起,2022 款蘋果 iPad Air 5 今日開啟預售:M1 晶片、Liquid 視網膜屏

4399 元起,2022 款蘋果 iPad Air 5 今日開啟預售:M1 晶片、Liquid 視網膜屏

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 "$@"
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過程執行