在前邊的隨筆中我們聊到了docker的基本命令,鏡像,網(wǎng)絡(luò),存儲(chǔ)卷以及基于現(xiàn)有容器制做docker鏡像,相關(guān)隨筆可參考https://www.cnblogs.com/qiuhom-1874/category/1766327.html;今天我們來(lái)聊一聊docker的另一個(gè)制作鏡像的方式dockerfile; 什么是dockerfile?所謂dockerfile就是用來(lái)描述docker鏡像制作過(guò)程的一指令文件;該文件是一個(gè)純文本文件,docker Daemon 進(jìn)程可以從該文件中讀取指令,從而自動(dòng)生成鏡像;客戶端可以使用docker bulid命令來(lái)指定dockerfile 所在目錄,來(lái)生成以dockerfile里描述的鏡像構(gòu)建過(guò)程的鏡像; 首先我們來(lái)了解下dockerfile的格式,dockerfile是一個(gè)純文本文件,我們可以理解為構(gòu)建鏡像的源碼;不同于其他編程語(yǔ)言,dockerfile里沒(méi)有if else 沒(méi)有循環(huán),它里面僅僅有注釋和構(gòu)建鏡像的指令;對(duì)于dockerfile注釋就是以井號(hào)開(kāi)頭的行為注釋,這個(gè)和shell和其他配置文件的語(yǔ)法一樣;除此之外dockerfile里就只有指令了;嚴(yán)格的講指令是不區(qū)分字符大小寫(xiě)的,通常我們約定俗成指令都是純大寫(xiě);除此之外在dockerfile的第一非注釋行必須是FROM開(kāi)頭來(lái)明確的說(shuō)明我們?cè)诨谀莻€(gè)鏡像為基礎(chǔ)鏡像做鏡像; 通常情況下dockerfile是放在一個(gè)目錄下,該目錄就是dockerfile的工作目錄,我們?cè)谥谱麋R像所依賴的文件都必須放在該目錄下,而dockerfile的名稱也必須是Dockerfile(首字母大寫(xiě),名稱必須是Dockerfile),如果我們依賴的文件是一個(gè)目錄下的部分文件,我們也可在dockerfile所在目錄創(chuàng)建一個(gè).dockerignore文件,把我們要忽略的文件名稱寫(xiě)到里面即可,該文件支持通配符; 了解了上面的dockerfile的基本環(huán)境結(jié)構(gòu),接下來(lái)我們來(lái)說(shuō)說(shuō)dockerfile的指令的用法; 1、FROM:用于指定所創(chuàng)建鏡像的基礎(chǔ)鏡像,如果本地不存在,默認(rèn)會(huì)從dockerhub中下載;該指令是dockerfile里的第一個(gè)非注釋行的指令;語(yǔ)法格式 FROM <repository>[:<tag>] 或者FROM <repository>@<digest> 其中repository是指定的base 鏡像的名稱 <tag>是base 鏡像的標(biāo)簽為可選項(xiàng),不指定標(biāo)簽?zāi)J(rèn)表示使用指定鏡像的latest版本; 2、MAINTAINER:用于指定維護(hù)者信息,dockerfile并不限制MAINTAINER指令可出現(xiàn)的位置,通常我們建議將該指令放在FROM之后;語(yǔ)法格式 MAINTAINER <authtor's detail>, <author's detail>可是任何文本信息,但約定俗成地使用作者名稱及郵件地址; 示例: [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" [root@node1 test]# 提示:通常我們都不用MAINTAINER來(lái)指定作者信息,該指令幾乎是廢棄狀態(tài),建議使用LEBEL指令來(lái)指定; 3、LABEL:該指令用于指定添加鏡像的元數(shù)據(jù)信息;語(yǔ)法格式為L(zhǎng)ABEL <key>=<value> <key>=<value> <key>=<value> ...;如果添加的元數(shù)據(jù)信息值中有空格,我們需要使用引號(hào)和反斜線進(jìn)行命令行解析; 示例: [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." [root@node1 test]# 提示:LABEL指令可以使用多次,用于添加更多的元數(shù)據(jù)信息; 4、COPY:該指令用于從Docker主機(jī)復(fù)制文件至創(chuàng)建的鏡像文件中;語(yǔ)法格式 COPY <src> ... <dest> 或 COPY ["<src>",... "<dest>"];<src>表示要復(fù)制的源文件或目錄,支持使用通配符;<dest>表示目標(biāo)路徑,即正在創(chuàng)建的image的文件系統(tǒng)路徑;建議為<dest>使用絕對(duì)路徑,否則,COPY指定則以WORKDIR為其起始路徑;注意:在路徑中有空白字符時(shí),通常使用第二種格式; 文件復(fù)制準(zhǔn)則 1、<src>必須是Dockerfile所在目錄中的文件,不能是其父目錄中的文件; 2、如果<src>是目錄,則其內(nèi)部文件或子目錄會(huì)被遞歸復(fù)制,但<src>目錄自身不會(huì)被復(fù)制; 3、如果指定了多個(gè)<src>,或在<src>中使用了通配符,則<dest>必須是一個(gè)目錄,且必須以“/”結(jié)尾; 4、如果<dest>事先不存在,它會(huì)被自動(dòng)創(chuàng)建,則包括其父目錄路徑; 示例: [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" 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]# 測(cè)試:我們基于上面的Dockerfile構(gòu)建鏡像,看看構(gòu)建好的鏡像是否把對(duì)應(yīng)文件都復(fù)制到對(duì)應(yīng)目錄下了? [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 <qiuhom@linux-1874.com>" ---> 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時(shí)會(huì)把一條指令啟動(dòng)一容器來(lái)執(zhí)行,然后每一條指令都會(huì)構(gòu)建成一層鏡像;如果我們本地倉(cāng)庫(kù)中沒(méi)有我們指定的基礎(chǔ)鏡像,它默認(rèn)會(huì)從dockerhub倉(cāng)庫(kù)中去把指定鏡像拖到本地;docker build命令是用來(lái)基于dockerfile來(lái)制作鏡像的命令,其中-t表示指定我們生成的鏡像的標(biāo)簽信息; 運(yùn)行我們剛才制作好的鏡像,看看我們的指定的目錄和文件是否都復(fù)制到指定鏡像中的目錄中去了? [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]# 提示:可以看到我們以剛才制作的鏡像運(yùn)行成容器,容器對(duì)應(yīng)目錄有我們指定復(fù)制的文件; 示例: [root@node1 test]# ls Dockerfile html nginx-1.19.0.tar.gz test.html [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" 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:///download/nginx-1.18.0.tar.gz /usr/src/ ADD nginx-1.19.0.tar.gz /tmp/ [root@node1 test]# 提示:以上Dokcerfile里指定把當(dāng)前目錄下的nginx-1.19.0.tar.gz 添加到鏡像中的/tmp/下,并且會(huì)把nginx-1.19.0.tar.gz展開(kāi)成一個(gè)目錄;而對(duì)于 ADD http:///download/nginx-1.18.0.tar.gz /usr/src/這條指令它會(huì)把指定url的文件下載到/usr/src/,但是不會(huì)tar文件展開(kāi); 測(cè)試:把上面dockerfile編譯成鏡像,看看對(duì)應(yīng)目錄中的文件是否都展開(kāi)了? [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 <qiuhom@linux-1874.com>" ---> 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:///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并沒(méi)有展開(kāi),而在/tmp/下卻把niginx-1.19.0.tar.gz展開(kāi)為nginx-1.19.0;從build的過(guò)程來(lái)看,除開(kāi)后面的ADD過(guò)程,其他過(guò)程都很快,并且明確告訴我們使用了cache,則意味著在本地倉(cāng)庫(kù)中有的鏡像層,默認(rèn)是共享的; 6、WORKDIR:該指令用于設(shè)定Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指令的工作目錄;一個(gè)Dockerfile中可以多次使用WORKDIR來(lái)指定當(dāng)前WORKDIR指令到下一個(gè)WORKDIR指令之間的指令的工作目錄;語(yǔ)法格式WORKDIR <dirpath>;在Dockerfile文件中,WORKDIR指令可出現(xiàn)多次,其路徑也可以為相對(duì)路徑,不過(guò),其是相對(duì)此前一個(gè)WORKDIR指令指定的路徑,另外,WORKDIR也可調(diào)用由ENV指定定義的變量; 示例: [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" 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:///download/nginx-1.18.0.tar.gz src/ ADD nginx-1.19.0.tar.gz /tmp/ [root@node1 test]# 提示:我們?cè)赿ockerfile中指定了workdir的路徑后,其后的指令就可以以上一個(gè)workdir指定的路徑 為基準(zhǔn)后面使用相對(duì)路徑; 測(cè)試:制作鏡像運(yùn)行容器,看看是否把對(duì)應(yīng)文件都添加到容器的指定目錄里? [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" 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:///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 <qiuhom@linux-1874.com>" ---> 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:///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]# 提示:可以看到我們制作的鏡像啟動(dòng)為容器后,默認(rèn)是我們指定的最后一個(gè)workdir的路徑; 示例:使用環(huán)境變量指定workdi的路徑; [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" 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:///download/nginx-1.18.0.tar.gz src/ ADD nginx-1.19.0.tar.gz /tmp/ [root@node1 test]# 提示:我們?cè)谠械腄ockerfile中添加了ENV webhome="/var/www/" src_home="/usr/" 表示添加兩個(gè)環(huán)境變量,而這兩個(gè)環(huán)境的變量的值分別是“/var/www/” 和“/usr” 這樣一來(lái),在后面workdir引用該環(huán)境變量時(shí) 就會(huì)把對(duì)應(yīng)的值給替換過(guò)去;dockerfile中變量引用同shell中的變量引用一樣都是使用$符合引用變量; 測(cè)試:利用上面的Dockerfile編譯成鏡像,然后運(yùn)行成容器,看看我們?cè)赿ockerfile中定義的環(huán)境變量是否能夠被容器所引用? [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 <qiuhom@linux-1874.com>" ---> 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:///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環(huán)境變量是能夠被WORKDIR說(shuō)引用 7、ENV:用于為鏡像定義所需的環(huán)境變量,并可被Dockerfile文件中位于其后的其它指令(如ENV、ADD、COPY等)所調(diào)用;調(diào)用格式為$variable_name或${variable_name};語(yǔ)法格式ENV <key> <value> 或 ENV <key>=<value> ...;第一種格式中,<key>之后的所有內(nèi)容均會(huì)被視作其<value>的組成部分,因此,一次只能設(shè)置一個(gè)變量;第二種格式可用一次設(shè)置多個(gè)變量,每個(gè)變量為一個(gè)"<key>=<value>"的鍵值對(duì),如果<value>中包含空格,可以以反斜線(\)進(jìn)行轉(zhuǎn)義,也可通過(guò)對(duì)<value>加引號(hào)進(jìn)行標(biāo)識(shí);另外,反斜線也可用于續(xù)行;定義多個(gè)變量時(shí),建議使用第二種方式,以便在同一層中完成所有功能; 示例: [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" 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設(shè)置了環(huán)境變量web_home="/var/www/html" ,后面的COPY引用時(shí)直接使用${web_home}即可;COPY html ${web_home}表示把html目錄中的文件復(fù)制到web_home這個(gè)變量所指定的目錄中,即/var/www/html/; 測(cè)試:編譯成鏡像,看看是否把對(duì)應(yīng)html目錄下的文件復(fù)制到/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 <qiuhom@linux-1874.com>" ---> 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]# 提示:可以看到我們打包的鏡像運(yùn)行成容器后,ENV指定的環(huán)境變量目錄里有html目錄下的所有文件; 8、ARG:該指令用于編譯階段可以使用docker build --build-arg向dockerfile里ARG 指定的變量傳遞值;語(yǔ)法格式ARG <name>[=<default value>];該指令可以在dockerfile中使用多次,也可以給定默認(rèn)變量一個(gè)默認(rèn)的值,在用戶沒(méi)有向該變量傳遞值的情況; 示例: [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" 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變量的默認(rèn)值是“/var/www/html/” 如果在我們build階段沒(méi)有使用--build-arg來(lái)向web_home傳遞值時(shí),它默認(rèn)就是“/var/www/html/”,如果我們使用了 --build-agr 指定web_home的值后,后面引用web_home變量的值就是我們用--build-arg傳遞給它的值; 測(cè)試:使用--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 <qiuhom@linux-1874.com>" ---> 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]# 提示:可以看到我們傳遞進(jìn)去的路徑下有html目錄下的兩個(gè)網(wǎng)頁(yè)文件;這說(shuō)明通過(guò)--build-arg 選項(xiàng)可以向Dockerfile里ARG指定指定的變量傳遞值的; 示例:引用變量給定變量默認(rèn)值 [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" 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]# 提示:引用變量給定變量默認(rèn)值的方式同shell中的用法一樣;${web_home:-"/data/htdoc/"} 表示如果web_home這個(gè)變量的值未設(shè)定或者為空時(shí),就使用默認(rèn)的值“/data/htdoc/”這個(gè)值,如果設(shè)置了,那么設(shè)置的是什么值就是什么值; 測(cè)試:不使用--build-arg向web_home傳遞值,看看web_home是否會(huì)拿到默認(rèn)值? [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 <qiuhom@linux-1874.com>" ---> 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傳遞值,默認(rèn)就是使用我們給設(shè)定的默認(rèn)值 測(cè)試:向web_home傳遞值,看看是否還會(huì)使用默認(rèn)值呢? [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 <qiuhom@linux-1874.com>" ---> 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]# 提示:可以看到通過(guò)--build-arg傳遞了web_home的值為“/web/htm/”后,默認(rèn)的“/data/htdoc/”的值就不會(huì)生效; 9、VOLUME:用于在image中創(chuàng)建一個(gè)掛載點(diǎn)目錄,以掛載Docker host上的卷或其它容器上的卷;語(yǔ)法格式 VOLUME <mountpoint> 或 VOLUME ["<mountpoint>"];如果掛載點(diǎn)目錄路徑下此前的文件存在,docker run命令會(huì)在卷掛載完成后將此前的所有文件復(fù)制到新掛載的卷中; 示例: [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" 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是指定鏡像里的掛載點(diǎn),如果該掛載點(diǎn)里面原來(lái)是有文件存在,在使用docker run 時(shí),用-v指定把宿主機(jī)上的某個(gè)目錄掛載到該掛載點(diǎn)時(shí),默認(rèn)會(huì)把原來(lái)有的文件復(fù)制新掛載的卷中;這里還需要特被說(shuō)一下,這里指定卷是在鏡像內(nèi)部創(chuàng)建一個(gè)掛載點(diǎn),運(yùn)行成容器還需要我們手動(dòng)的用-v去指定把那個(gè)目錄掛載到該掛載點(diǎn),如果不指定默認(rèn)就是docker-managed 類型的卷; 測(cè)試:編譯成鏡像,然后運(yùn)行成容器,看看我們指定的卷宗的文件會(huì)不會(huì)被覆蓋掉?是否會(huì)有文件存在? [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 <qiuhom@linux-1874.com>" ---> 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]# 提示:可以看到運(yùn)行成容器后,默認(rèn)會(huì)把我們指定卷掛載成docker-managed類型的卷;同時(shí)我們也看到了對(duì)應(yīng)掛載點(diǎn)上目錄會(huì)把原有文件復(fù)制到現(xiàn)volume中; 測(cè)試:手動(dòng)指定宿主機(jī)目錄掛載到掛載點(diǎn),文件是否還會(huì)存在呢? [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 ~]# 提示:手動(dòng)指定掛載關(guān)系,它就不會(huì)把原有目錄下的文件復(fù)制到現(xiàn)掛載目錄中了;也就是說(shuō),人為手動(dòng)指定掛載關(guān)系,宿主機(jī)上的的目錄會(huì)覆蓋容器內(nèi)掛載點(diǎn)下的文件;只有docker自身管理的掛載的卷才會(huì)把原目錄下的文件復(fù)制到現(xiàn)掛載目錄里; 10、EXPOSE:用于為容器打開(kāi)指定要監(jiān)聽(tīng)的端口以實(shí)現(xiàn)與外部通信(暴露端口);語(yǔ)法格式 EXPOSE <port>[/<protocol>] [<port>[/<protocol>] ...]; <protocol>用于指定傳輸層協(xié)議,可為tcp或udp二者之一,默認(rèn)為TCP協(xié)議;EXPOSE指令可一次指定多個(gè)端口; 示例: [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" 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暴露端口,在運(yùn)行成容器時(shí),如果不使用-P來(lái)暴露端口,容器里的端口還是暴露不出來(lái);這里只是build階段明確說(shuō)明要暴露80和443,而運(yùn)行成容器我們需要使用-P來(lái)把build暴露的端口暴露出來(lái); 測(cè)試:運(yùn)行時(shí)不使用-P暴露端口,看看是否能夠把80和443暴露出來(lái)呢? [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 <qiuhom@linux-1874.com>" ---> 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]# 提示:可以看到運(yùn)行時(shí),我們不使用-P來(lái)暴露端口是把容器內(nèi)部端口暴露不出來(lái)的; 示例:使用-P來(lái)暴露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就可以在運(yùn)行時(shí)把build階段定義的暴露端口全部給暴露出來(lái); |
|