dockerfile的格式,dockerfile是一個純文本文件,我們可以理解為構建鏡像的源碼;不同於其他編程語言,dockerfile里沒有if else 沒有迴圈,它裡面僅僅有註釋和構建鏡像的指令;對於dockerfile註釋就是以井號開頭的行為註釋,這個和shell和其他配置文件的語法一樣;... ...
在前邊的隨筆中我們聊到了docker的基本命令,鏡像,網路,存儲捲以及基於現有容器製做docker鏡像,相關隨筆可參考https://www.cnblogs.com/qiuhom-1874/category/1766327.html;今天我們來聊一聊docker的另一個製作鏡像的方式dockerfile;
什麼是dockerfile?所謂dockerfile就是用來描述docker鏡像製作過程的一指令文件;該文件是一個純文本文件,docker Daemon 進程可以從該文件中讀取指令,從而自動生成鏡像;客戶端可以使用docker bulid命令來指定dockerfile 所在目錄,來生成以dockerfile里描述的鏡像構建過程的鏡像;
首先我們來瞭解下dockerfile的格式,dockerfile是一個純文本文件,我們可以理解為構建鏡像的源碼;不同於其他編程語言,dockerfile里沒有if else 沒有迴圈,它裡面僅僅有註釋和構建鏡像的指令;對於dockerfile註釋就是以井號開頭的行為註釋,這個和shell和其他配置文件的語法一樣;除此之外dockerfile里就只有指令了;嚴格的講指令是不區分字元大小寫的,通常我們約定俗成指令都是純大寫;除此之外在dockerfile的第一非註釋行必須是FROM開頭來明確的說明我們在基於那個鏡像為基礎鏡像做鏡像;
通常情況下dockerfile是放在一個目錄下,該目錄就是dockerfile的工作目錄,我們在製作鏡像所依賴的文件都必須放在該目錄下,而dockerfile的名稱也必須是Dockerfile(首字母大寫,名稱必須是Dockerfile),如果我們依賴的文件是一個目錄下的部分文件,我們也可在dockerfile所在目錄創建一個.dockerignore文件,把我們要忽略的文件名稱寫到裡面即可,該文件支持通配符;
瞭解了上面的dockerfile的基本環境結構,接下來我們來說說dockerfile的指令的用法;
1、FROM:用於指定所創建鏡像的基礎鏡像,如果本地不存在,預設會從dockerhub中下載;該指令是dockerfile里的第一個非註釋行的指令;語法格式 FROM <repository>[:<tag>] 或者FROM <repository>@<digest> 其中repository是指定的base 鏡像的名稱 <tag>是base 鏡像的標簽為可選項,不指定標簽預設表示使用指定鏡像的latest版本;
2、MAINTAINER:用於指定維護者信息,dockerfile並不限制MAINTAINER指令可出現的位置,通常我們建議將該指令放在FROM之後;語法格式 MAINTAINER <authtor's detail>, <author's detail>可是任何文本信息,但約定俗成地使用作者名稱及郵件地址;
示例:
[root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <[email protected]>" [root@node1 test]#
提示:通常我們都不用MAINTAINER來指定作者信息,該指令幾乎是廢棄狀態,建議使用LEBEL指令來指定;
3、LABEL:該指令用於指定添加鏡像的元數據信息;語法格式為LABEL <key>=<value> <key>=<value> <key>=<value> ...;如果添加的元數據信息值中有空格,我們需要使用引號和反斜線進行命令行解析;
示例:
[root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <[email protected]>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." [root@node1 test]#
提示:LABEL指令可以使用多次,用於添加更多的元數據信息;
4、COPY:該指令用於從Docker主機複製文件至創建的鏡像文件中;語法格式 COPY <src> ... <dest> 或 COPY ["<src>",... "<dest>"];<src>表示要複製的源文件或目錄,支持使用通配符;<dest>表示目標路徑,即正在創建的image的文件系統路徑;建議為<dest>使用絕對路徑,否則,COPY指定則以WORKDIR為其起始路徑;註意:在路徑中有空白字元時,通常使用第二種格式;
文件複製準則
1、<src>必須是Dockerfile所在目錄中的文件,不能是其父目錄中的文件;
2、如果<src>是目錄,則其內部文件或子目錄會被遞歸複製,但<src>目錄自身不會被覆制;
3、如果指定了多個<src>,或在<src>中使用了通配符,則<dest>必須是一個目錄,且必須以“/”結尾;
4、如果<dest>事先不存在,它會被自動創建,則包括其父目錄路徑;
示例:
[root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <[email protected]>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." COPY html /var/www/html/ COPY test.html /tmp/ [root@node1 test]# tree . ├── Dockerfile ├── html │ ├── test1.html │ └── test2.html └── test.html 1 directory, 4 files [root@node1 test]#
測試:我們基於上面的Dockerfile構建鏡像,看看構建好的鏡像是否把對應文件都複製到對應目錄下了?
[root@node1 test]# ls Dockerfile html test.html [root@node1 test]# pwd /root/test [root@node1 test]# docker build . -t myimg:v0.1 Sending build context to Docker daemon 5.632kB Step 1/6 : FROM busybox:latest latest: Pulling from library/busybox d9cbbca60e5f: Pull complete Digest: sha256:836945da1f3afe2cfff376d379852bbb82e0237cb2925d53a13f53d6e8a8c48c Status: Downloaded newer image for busybox:latest ---> 78096d0a5478 Step 2/6 : MAINTAINER "qiuhom <[email protected]>" ---> Running in c311afd3d522 Removing intermediate container c311afd3d522 ---> bf9b966a914b Step 3/6 : LABEL version="1.0" ---> Running in 2ffb577afa08 Removing intermediate container 2ffb577afa08 ---> 5dd2e4b3f594 Step 4/6 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Running in 489165bad668 Removing intermediate container 489165bad668 ---> 994f06ff65f8 Step 5/6 : COPY html /var/www/html/ ---> f2b46094d9a9 Step 6/6 : COPY test.html /tmp/ ---> c78c7188f804 Successfully built c78c7188f804 Successfully tagged myimg:v0.1 [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v0.1 c78c7188f804 8 seconds ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]#
提示:可以看到docker在讀dockerfile時會把一條指令啟動一容器來執行,然後每一條指令都會構建成一層鏡像;如果我們本地倉庫中沒有我們指定的基礎鏡像,它預設會從dockerhub倉庫中去把指定鏡像拖到本地;docker build命令是用來基於dockerfile來製作鏡像的命令,其中-t表示指定我們生成的鏡像的標簽信息;
運行我們剛纔製作好的鏡像,看看我們的指定的目錄和文件是否都複製到指定鏡像中的目錄中去了?
[root@node1 test]# docker run --name test --rm -it myimg:v0.1 /bin/sh / # ls bin dev etc home proc root sys tmp usr var / # ls /var/www/html/ test1.html test2.html / # ls /tmp/ test.html / # cat /var/www/html/test1.html this is test1 html / # cat /var/www/html/test2.html this is test2 html / # cat /tmp/test.html this is test dir html / # exit [root@node1 test]#
提示:可以看到我們以剛纔製作的鏡像運行成容器,容器對應目錄有我們指定複製的文件;
5、ADD:該指令類似於COPY指令,ADD支持使用TAR文件和URL路徑;語法格式 ADD <src> ... <dest> 或 ADD ["<src>",... "<dest>"];如果<src>為URL且<dest>不以/結尾,則<src>指定的文件將被下載並直接被創建為<dest>;如果<dest>以/結尾,則URL指定的文件將被直接下載並保存為<dest>/<filename>;如果<src>是一個本地系統上的壓縮格式的tar文件,它將被展開為一個目錄,其行為類似於“tar -x”命令;然而,通過URL獲取到的tar文件將不會自動展開;如果<src>有多個,或其間接或直接使用了通配符,則<dest>必須是一個以/結尾的目錄路徑;如果<dest>不以/結尾,則其被視作一個普通文件,<src>的內容將被直接寫入到<dest>;
示例:
[root@node1 test]# ls Dockerfile html nginx-1.19.0.tar.gz test.html [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <[email protected]>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." COPY html /var/www/html/ COPY test.html /tmp/ ADD http://nginx.org/download/nginx-1.18.0.tar.gz /usr/src/ ADD nginx-1.19.0.tar.gz /tmp/ [root@node1 test]#
提示:以上Dokcerfile里指定把當前目錄下的nginx-1.19.0.tar.gz 添加到鏡像中的/tmp/下,並且會把nginx-1.19.0.tar.gz展開成一個目錄;而對於
ADD http://nginx.org/download/nginx-1.18.0.tar.gz /usr/src/這條指令它會把指定url的文件下載到/usr/src/,但是不會tar文件展開;
測試:把上面dockerfile編譯成鏡像,看看對應目錄中的文件是否都展開了?
[root@node1 test]# docker build . -t myimg:v0.2 Sending build context to Docker daemon 1.05MB Step 1/8 : FROM busybox:latest ---> 78096d0a5478 Step 2/8 : MAINTAINER "qiuhom <[email protected]>" ---> Using cache ---> bf9b966a914b Step 3/8 : LABEL version="1.0" ---> Using cache ---> 5dd2e4b3f594 Step 4/8 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Using cache ---> 994f06ff65f8 Step 5/8 : COPY html /var/www/html/ ---> Using cache ---> f2b46094d9a9 Step 6/8 : COPY test.html /tmp/ ---> Using cache ---> c78c7188f804 Step 7/8 : ADD http://nginx.org/download/nginx-1.18.0.tar.gz /usr/src/ Downloading 1.04MB/1.04MB ---> 23f47a028853 Step 8/8 : ADD nginx-1.19.0.tar.gz /tmp/ ---> 6ba2693b3084 Successfully built 6ba2693b3084 Successfully tagged myimg:v0.2 [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v0.2 6ba2693b3084 27 seconds ago 8.54MB myimg v0.1 c78c7188f804 25 minutes ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker run --name test --rm -it myimg:v0.2 /bin/sh / # ls /usr/src/ nginx-1.18.0.tar.gz / # ls /tmp nginx-1.19.0 test.html / # exit [root@node1 test]#
提示:從上面的信息可以看到,在容器中的/usr/src/目錄下nginx-1.18.0.tar.gz並沒有展開,而在/tmp/下卻把niginx-1.19.0.tar.gz展開為nginx-1.19.0;從build的過程來看,除開後面的ADD過程,其他過程都很快,並且明確告訴我們使用了cache,則意味著在本地倉庫中有的鏡像層,預設是共用的;
6、WORKDIR:該指令用於設定Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指令的工作目錄;一個Dockerfile中可以多次使用WORKDIR來指定當前WORKDIR指令到下一個WORKDIR指令之間的指令的工作目錄;語法格式WORKDIR <dirpath>;在Dockerfile文件中,WORKDIR指令可出現多次,其路徑也可以為相對路徑,不過,其是相對此前一個WORKDIR指令指定的路徑,另外,WORKDIR也可調用由ENV指定定義的變數;
示例:
[root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <[email protected]>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." WORKDIR /var/www/ COPY html html/ COPY test.html /tmp/ WORKDIR /usr/ ADD http://nginx.org/download/nginx-1.18.0.tar.gz src/ ADD nginx-1.19.0.tar.gz /tmp/ [root@node1 test]#
提示:我們在dockerfile中指定了workdir的路徑後,其後的指令就可以以上一個workdir指定的路徑 為基準後面使用相對路徑;
測試:製作鏡像運行容器,看看是否把對應文件都添加到容器的指定目錄里?
[root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <[email protected]>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." WORKDIR /var/www/ COPY html html/ COPY test.html /tmp/ WORKDIR /usr/ ADD http://nginx.org/download/nginx-1.18.0.tar.gz src/ ADD nginx-1.19.0.tar.gz /tmp/ [root@node1 test]# [root@node1 test]# docker build . -t myimg:v0.3 Sending build context to Docker daemon 1.05MB Step 1/10 : FROM busybox:latest ---> 78096d0a5478 Step 2/10 : MAINTAINER "qiuhom <[email protected]>" ---> Using cache ---> bf9b966a914b Step 3/10 : LABEL version="1.0" ---> Using cache ---> 5dd2e4b3f594 Step 4/10 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Using cache ---> 994f06ff65f8 Step 5/10 : WORKDIR /var/www/ ---> Running in 623002a4c418 Removing intermediate container 623002a4c418 ---> 7e6898b36dd5 Step 6/10 : COPY html html/ ---> 57ff5a48a104 Step 7/10 : COPY test.html /tmp/ ---> f66a1bf4040a Step 8/10 : WORKDIR /usr/ ---> Running in b905ff1b4529 Removing intermediate container b905ff1b4529 ---> 1fdceb9a6bfd Step 9/10 : ADD http://nginx.org/download/nginx-1.18.0.tar.gz src/ Downloading 1.04MB/1.04MB ---> 92868df29f5b Step 10/10 : ADD nginx-1.19.0.tar.gz /tmp/ ---> 68161c3beb90 Successfully built 68161c3beb90 Successfully tagged myimg:v0.3 [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v0.3 68161c3beb90 11 seconds ago 8.54MB myimg v0.2 6ba2693b3084 18 minutes ago 8.54MB myimg v0.1 c78c7188f804 43 minutes ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker run --name test --rm -it myimg:v0.3 /bin/sh /usr # pwd /usr /usr # ls sbin src /usr # ls src/ nginx-1.18.0.tar.gz /usr # ls /tmp/ nginx-1.19.0 test.html /usr # ls /var/www/ html /usr # exit [root@node1 test]#
提示:可以看到我們製作的鏡像啟動為容器後,預設是我們指定的最後一個workdir的路徑;
示例:使用環境變數指定workdi的路徑;
[root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <[email protected]>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." ENV webhome="/var/www/" src_home="/usr/" WORKDIR $webhome COPY html html/ COPY test.html /tmp/ WORKDIR $src_home ADD http://nginx.org/download/nginx-1.18.0.tar.gz src/ ADD nginx-1.19.0.tar.gz /tmp/ [root@node1 test]#
提示:我們在原有的Dockerfile中添加了ENV webhome="/var/www/" src_home="/usr/" 表示添加兩個環境變數,而這兩個環境的變數的值分別是“/var/www/” 和“/usr” 這樣一來,在後面workdir引用該環境變數時 就會把對應的值給替換過去;dockerfile中變數引用同shell中的變數引用一樣都是使用$符合引用變數;
測試:利用上面的Dockerfile編譯成鏡像,然後運行成容器,看看我們在dockerfile中定義的環境變數是否能夠被容器所引用?
[root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v0.3 68161c3beb90 34 minutes ago 8.54MB myimg v0.2 6ba2693b3084 53 minutes ago 8.54MB myimg v0.1 c78c7188f804 About an hour ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker build . -t myimg:v0.4 Sending build context to Docker daemon 1.05MB Step 1/11 : FROM busybox:latest ---> 78096d0a5478 Step 2/11 : MAINTAINER "qiuhom <[email protected]>" ---> Using cache ---> bf9b966a914b Step 3/11 : LABEL version="1.0" ---> Using cache ---> 5dd2e4b3f594 Step 4/11 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Using cache ---> 994f06ff65f8 Step 5/11 : ENV webhome="/var/www/" src_home="/usr/" ---> Running in 82738c50a595 Removing intermediate container 82738c50a595 ---> 9f089c14778f Step 6/11 : WORKDIR $webhome ---> Running in 3e9d7d4276bf Removing intermediate container 3e9d7d4276bf ---> 94e17268d7ea Step 7/11 : COPY html html/ ---> cf3be18998db Step 8/11 : COPY test.html /tmp/ ---> 3b81cb058412 Step 9/11 : WORKDIR $src_home ---> Running in 70478cb9d405 Removing intermediate container 70478cb9d405 ---> e0d8ab9331f4 Step 10/11 : ADD http://nginx.org/download/nginx-1.18.0.tar.gz src/ Downloading 1.04MB/1.04MB ---> b4e546989783 Step 11/11 : ADD nginx-1.19.0.tar.gz /tmp/ ---> df3d040b5766 Successfully built df3d040b5766 Successfully tagged myimg:v0.4 [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v0.4 df3d040b5766 4 minutes ago 8.54MB myimg v0.3 68161c3beb90 41 minutes ago 8.54MB myimg v0.2 6ba2693b3084 59 minutes ago 8.54MB myimg v0.1 c78c7188f804 About an hour ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker run --name test --rm -it myimg:v0.4 /bin/sh /usr # pwd /usr /usr # ls /var/www/ html /usr # ls /usr/src/ nginx-1.18.0.tar.gz /usr #
提示:可以看到我們指定的ENV環境變數是能夠被WORKDIR說引用
7、ENV:用於為鏡像定義所需的環境變數,並可被Dockerfile文件中位於其後的其它指令(如ENV、ADD、COPY等)所調用;調用格式為$variable_name或${variable_name};語法格式ENV <key> <value> 或 ENV <key>=<value> ...;第一種格式中,<key>之後的所有內容均會被視作其<value>的組成部分,因此,一次只能設置一個變數;第二種格式可用一次設置多個變數,每個變數為一個"<key>=<value>"的鍵值對,如果<value>中包含空格,可以以反斜線(\)進行轉義,也可通過對<value>加引號進行標識;另外,反斜線也可用於續行;定義多個變數時,建議使用第二種方式,以便在同一層中完成所有功能;
示例:
[root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <[email protected]>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." ENV web_home="/var/www/html/" COPY html ${web_home} [root@node1 test]#
提示:上面Dockerfile設置了環境變數web_home="/var/www/html" ,後面的COPY引用時直接使用${web_home}即可;COPY html ${web_home}表示把html目錄中的文件複製到web_home這個變數所指定的目錄中,即/var/www/html/;
測試:編譯成鏡像,看看是否把對應html目錄下的文件複製到/var/www/html/目錄下了?
[root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v0.4 df3d040b5766 17 minutes ago 8.54MB myimg v0.3 68161c3beb90 54 minutes ago 8.54MB myimg v0.2 6ba2693b3084 About an hour ago 8.54MB myimg v0.1 c78c7188f804 2 hours ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker build . -t myimg:v0.5 Sending build context to Docker daemon 1.05MB Step 1/6 : FROM busybox:latest ---> 78096d0a5478 Step 2/6 : MAINTAINER "qiuhom <[email protected]>" ---> Using cache ---> bf9b966a914b Step 3/6 : LABEL version="1.0" ---> Using cache ---> 5dd2e4b3f594 Step 4/6 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Using cache ---> 994f06ff65f8 Step 5/6 : ENV web_home="/var/www/html/" ---> Running in 4c136d790dd0 Removing intermediate container 4c136d790dd0 ---> 90e193e4e810 Step 6/6 : COPY html ${web_home} ---> e21e9479b0a7 Successfully built e21e9479b0a7 Successfully tagged myimg:v0.5 [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v0.5 e21e9479b0a7 4 seconds ago 1.22MB myimg v0.4 df3d040b5766 17 minutes ago 8.54MB myimg v0.3 68161c3beb90 54 minutes ago 8.54MB myimg v0.2 6ba2693b3084 About an hour ago 8.54MB myimg v0.1 c78c7188f804 2 hours ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker run --name test --rm -it myimg:v0.5 /bin/sh / # ls /var/www/html/ test1.html test2.html / # exit [root@node1 test]#
提示:可以看到我們打包的鏡像運行成容器後,ENV指定的環境變數目錄里有html目錄下的所有文件;
8、ARG:該指令用於編譯階段可以使用docker build --build-arg向dockerfile里ARG 指定的變數傳遞值;語法格式ARG <name>[=<default value>];該指令可以在dockerfile中使用多次,也可以給定預設變數一個預設的值,在用戶沒有向該變數傳遞值的情況;
示例:
[root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <[email protected]>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." ARG web_home="/var/www/html/" COPY html ${web_home} [root@node1 test]#
提示:以上Dockerfile 指定了web_home變數的預設值是“/var/www/html/” 如果在我們build階段沒有使用--build-arg來向web_home傳遞值時,它預設就是“/var/www/html/”,如果我們使用了 --build-agr 指定web_home的值後,後面引用web_home變數的值就是我們用--build-arg傳遞給它的值;
測試:使用--build-arg向web_home傳遞值
[root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v0.5 e21e9479b0a7 14 minutes ago 1.22MB myimg v0.4 df3d040b5766 31 minutes ago 8.54MB myimg v0.3 68161c3beb90 About an hour ago 8.54MB myimg v0.2 6ba2693b3084 About an hour ago 8.54MB myimg v0.1 c78c7188f804 2 hours ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker build . --build-arg web_home="/usr/share/www/html/" -t myimg:v0.6 Sending build context to Docker daemon 1.05MB Step 1/6 : FROM busybox:latest ---> 78096d0a5478 Step 2/6 : MAINTAINER "qiuhom <[email protected]>" ---> Using cache ---> bf9b966a914b Step 3/6 : LABEL version="1.0" ---> Using cache ---> 5dd2e4b3f594 Step 4/6 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Using cache ---> 994f06ff65f8 Step 5/6 : ARG web_home="/var/www/html/" ---> Running in d8697abf9206 Removing intermediate container d8697abf9206 ---> 6abb65dab341 Step 6/6 : COPY html ${web_home} ---> 385cba27c288 Successfully built 385cba27c288 Successfully tagged myimg:v0.6 [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v0.6 385cba27c288 6 seconds ago 1.22MB myimg v0.5 e21e9479b0a7 15 minutes ago 1.22MB myimg v0.4 df3d040b5766 32 minutes ago 8.54MB myimg v0.3 68161c3beb90 About an hour ago 8.54MB myimg v0.2 6ba2693b3084 About an hour ago 8.54MB myimg v0.1 c78c7188f804 2 hours ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker run --name test --rm -it myimg:v0.6 /bin/sh / # ls /usr/share/www/html/ test1.html test2.html / # exit [root@node1 test]#
提示:可以看到我們傳遞進去的路徑下有html目錄下的兩個網頁文件;這說明通過--build-arg 選項可以向Dockerfile里ARG指定指定的變數傳遞值的;
示例:引用變數給定變數預設值
[root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <[email protected]>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." ARG web_home COPY html ${web_home:-"/data/htdoc/"} [root@node1 test]#
提示:引用變數給定變數預設值的方式同shell中的用法一樣;${web_home:-"/data/htdoc/"} 表示如果web_home這個變數的值未設定或者為空時,就使用預設的值“/data/htdoc/”這個值,如果設置了,那麼設置的是什麼值就是什麼值;
測試:不使用--build-arg向web_home傳遞值,看看web_home是否會拿到預設值?
[root@node1 test]# docker build . -t myimg:v0.7 Sending build context to Docker daemon 1.05MB Step 1/6 : FROM busybox:latest ---> 78096d0a5478 Step 2/6 : MAINTAINER "qiuhom <[email protected]>" ---> Using cache ---> bf9b966a914b Step 3/6 : LABEL version="1.0" ---> Using cache ---> 5dd2e4b3f594 Step 4/6 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Using cache ---> 994f06ff65f8 Step 5/6 : ARG web_home ---> Running in 9d98f8e3a1f0 Removing intermediate container 9d98f8e3a1f0 ---> f164cc3e24ad Step 6/6 : COPY html ${web_home:-"/data/htdoc/"} ---> 4bedea2590b7 Successfully built 4bedea2590b7 Successfully tagged myimg:v0.7 [root@node1 test]# docker run --name test --rm -it myimg:v0.7 /bin/sh / # ls / bin data dev etc home proc root sys tmp usr var / # ls /data/ htdoc / # ls /data/htdoc/ test1.html test2.html / # exit [root@node1 test]#
提示:可以看到不想web_home傳遞值,預設就是使用我們給設定的預設值
測試:向web_home傳遞值,看看是否還會使用預設值呢?
[root@node1 test]# docker build . --build-arg web_home=/web/html/ -t myimg:v0.9 Sending build context to Docker daemon 1.05MB Step 1/6 : FROM busybox:latest ---> 78096d0a5478 Step 2/6 : MAINTAINER "qiuhom <[email protected]>" ---> Using cache ---> bf9b966a914b Step 3/6 : LABEL version="1.0" ---> Using cache ---> 5dd2e4b3f594 Step 4/6 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Using cache ---> 994f06ff65f8 Step 5/6 : ARG web_home ---> Using cache ---> f164cc3e24ad Step 6/6 : COPY html ${web_home:-"/data/htdoc/"} ---> 4b6993911e6d Successfully built 4b6993911e6d Successfully tagged myimg:v0.9 [root@node1 test]# docker run --name test --rm -it myimg:v0.9 /bin/sh / # ls / bin dev etc home proc root sys tmp usr var web / # ls /web/ html / # ls /web/html/ test1.html test2.html / # exit [root@node1 test]#
提示:可以看到通過--build-arg傳遞了web_home的值為“/web/htm/”後,預設的“/data/htdoc/”的值就不會生效;
9、VOLUME:用於在image中創建一個掛載點目錄,以掛載Docker host上的捲或其它容器上的捲;語法格式 VOLUME <mountpoint> 或 VOLUME ["<mountpoint>"];如果掛載點目錄路徑下此前的文件存在,docker run命令會在捲掛載完成後將此前的所有文件複製到新掛載的捲中;
示例:
[root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <[email protected]>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." ARG web_home COPY html ${web_home:-"/data/htdoc/"} VOLUME ${web_home:-"/data/htdoc/"} [root@node1 test]#
提示:volume是指定鏡像里的掛載點,如果該掛載點裡面原來是有文件存在,在使用docker run 時,用-v指定把宿主機上的某個目錄掛載到該掛載點時,預設會把原來有的文件複製新掛載的捲中;這裡還需要特被說一下,這裡指定捲是在鏡像內部創建一個掛載點,運行成容器還需要我們手動的用-v去指定把那個目錄掛載到該掛載點,如果不指定預設就是docker-managed 類型的捲;
測試:編譯成鏡像,然後運行成容器,看看我們指定的卷宗的文件會不會被覆蓋掉?是否會有文件存在?
[root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v0.9 4b6993911e6d 21 minutes ago 1.22MB myimg v0.7 4bedea2590b7 23 minutes ago 1.22MB myimg v0.6 385cba27c288 30 minutes ago 1.22MB myimg v0.5 e21e9479b0a7 46 minutes ago 1.22MB myimg v0.4 df3d040b5766 About an hour ago 8.54MB myimg v0.3 68161c3beb90 2 hours ago 8.54MB myimg v0.2 6ba2693b3084 2 hours ago 8.54MB myimg v0.1 c78c7188f804 2 hours ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker build . -t myimg:v1.0 Sending build context to Docker daemon 1.05MB Step 1/7 : FROM busybox:latest ---> 78096d0a5478 Step 2/7 : MAINTAINER "qiuhom <[email protected]>" ---> Using cache ---> bf9b966a914b Step 3/7 : LABEL version="1.0" ---> Using cache ---> 5dd2e4b3f594 Step 4/7 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Using cache ---> 994f06ff65f8 Step 5/7 : ARG web_home ---> Using cache ---> f164cc3e24ad Step 6/7 : COPY html ${web_home:-"/data/htdoc/"} ---> Using cache ---> 4bedea2590b7 Step 7/7 : VOLUME ${web_home:-"/data/htdoc/"} ---> Running in 34cad9ca1f79 Removing intermediate container 34cad9ca1f79 ---> 9554284e4bba Successfully built 9554284e4bba Successfully tagged myimg:v1.0 [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v1.0 9554284e4bba 2 minutes ago 1.22MB myimg v0.9 4b6993911e6d 24 minutes ago 1.22MB myimg v0.7 4bedea2590b7 26 minutes ago 1.22MB myimg v0.6 385cba27c288 33 minutes ago 1.22MB myimg v0.5 e21e9479b0a7 49 minutes ago 1.22MB myimg v0.4 df3d040b5766 About an hour ago 8.54MB myimg v0.3 68161c3beb90 2 hours ago 8.54MB myimg v0.2 6ba2693b3084 2 hours ago 8.54MB myimg v0.1 c78c7188f804 2 hours ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker run --name test --rm -it myimg:v1.0 /bin/sh / # ls / bin data dev etc home proc root sys tmp usr var / # ls /data/htdoc/ test1.html test2.html / # [root@node1 test]# [root@node1 test]# docker container inspect test -f {{.Mounts}} [{volume f3409b021267bd27d58c4b16fb1bc0dae77d4f92f7b5e6255f4ed26a6c27e459 /var/lib/docker/volumes/f3409b021267bd27d58c4b16fb1bc0dae77d4f92f7b5e6255f4ed26a6c27e459/_data /data/htdoc local true }] [root@node1 test]# ll /var/lib/docker/volumes/f3409b021267bd27d58c4b16fb1bc0dae77d4f92f7b5e6255f4ed26a6c27e459/_data total 8 -rw-r--r-- 1 root root 19 May 31 01:51 test1.html -rw-r--r-- 1 root root 19 May 31 01:51 test2.html [root@node1 test]#
提示:可以看到運行成容器後,預設會把我們指定捲掛載成docker-managed類型的捲;同時我們也看到了對應掛載點上目錄會把原有文件複製到現volume中;
測試:手動指定宿主機目錄掛載到掛載點,文件是否還會存在呢?
[root@node1 ~]# mkdir /work [root@node1 ~]# docker run --name test1 --rm -it -v /work:/data/htdoc/ myimg:v1.0 /bin/sh / # ls /data/htdoc/ / # [root@node1 ~]# ls /work/ [root@node1 ~]#
提示:手動指定掛載關係,它就不會把原有目錄下的文件複製到現掛載目錄中了;也就是說,人為手動指定掛載關係,宿主機上的的目錄會覆蓋容器內掛載點下的文件;只有docker自身管理的掛載的捲才會把原目錄下的文件複製到現掛載目錄里;
10、EXPOSE:用於為容器打開指定要監聽的埠以實現與外部通信(暴露埠);語法格式 EXPOSE <port>[/<protocol>] [<port>[/<protocol>] ...]; <protocol>用於指定傳輸層協議,可為tcp或udp二者之一,預設為TCP協議;EXPOSE指令可一次指定多個埠;
示例:
[root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <[email protected]>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." ARG web_home COPY html ${web_home:-"/data/htdoc/"} VOLUME ${web_home:-"/data/htdoc/"} EXPOSE 80/tcp 443/tcp [root@node1 test]#
提示:以上dockerfile中暴露了tcp的80和443埠;在dockerfile中使用EXPOSE暴露埠,在運行成容器時,如果不使用-P來暴露埠,容器里的埠還是暴露不出來;這裡只是build階段明確說明要暴露80和443,而運行成容器我們需要使用-P來把build暴露的埠暴露出來;
測試:運行時不使用-P暴露埠,看看是否能夠把80和443暴露出來呢?
[root@node1 test]# docker build . -t myimg:v1.1 Sending build context to Docker daemon 1.05MB Step 1/8 : FROM busybox:latest ---> 78096d0a5478 Step 2/8 : MAINTAINER "qiuhom <[email protected]>" ---> Using cache ---> bf9b966a914b Step 3/8 : LABEL version="1.0" ---> Using cache ---> 5dd2e4b3f594 Step 4/8 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Using cache ---> 994f06ff65f8 Step 5/8 : ARG web_home ---> Using cache ---> f164cc3e24ad Step 6/8 : COPY html ${web_home:-"/data/htdoc/"} ---> Using cache ---> 4bedea2590b7 Step 7/8 : VOLUME ${web_home:-"/data/htdoc/"} ---> Using cache ---> 9554284e4bba Step 8/8 : EXPOSE 80/tcp 443/tcp ---> Running in 8d7d5b4aab94 Removing intermediate container 8d7d5b4aab94 ---> 79c118ea9eb3 Successfully built 79c118ea9eb3 Successfully tagged myimg:v1.1 [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v1.1 79c118ea9eb3 4 seconds ago 1.22MB myimg v1.0 9554284e4bba 24 minutes ago 1.22MB myimg v0.9 4b6993911e6d 46 minutes ago 1.22MB myimg v0.7 4bedea2590b7 48 minutes ago 1.22MB myimg v0.6 385cba27c288 55 minutes ago 1.22MB myimg v0.5 e21e9479b0a7 About an hour ago 1.22MB myimg v0.4 df3d040b5766 About an hour ago 8.54MB myimg v0.3 68161c3beb90 2 hours ago 8.54MB myimg v0.2 6ba2693b3084 2 hours ago 8.54MB myimg v0.1 c78c7188f804 3 hours ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker run --name test --rm -it myimg:v1.0 /bin/sh / # [root@node1 test]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ca4cea9a6f58 myimg:v1.0 "/bin/sh" 15 seconds ago Up 15 seconds test [root@node1 test]# docker container port test [root@node1 test]#
提示:可以看到運行時,我們不使用-P來暴露埠是把容器內部埠暴露不出來的;
示例:使用-P來暴露dockerfile里定義的埠
[root@node1 test]# docker run --name test --rm -it -P myimg:v1.1 /bin/sh / # [root@node1 test]# docker container port test 443/tcp -> 0.0.0.0:32768 80/tcp -> 0.0.0.0:32769 [root@node1 test]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a78f6cebc0de myimg:v1.1 "/bin/sh" 19 seconds ago Up 19 seconds 0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp test [root@node1 test]#
提示:可以看到使用-P就可以在運行時把build階段定義的暴露埠全部給暴露出來;